home *** CD-ROM | disk | FTP | other *** search
/ Chip: Special Tips & Tricks for Windows 95 / Chip Wintips.iso / sharewar / rozrywka / 3dmaze / 3dmaze.fr_ / 3dmaze.fr (.txt)
Encoding:
Visual Basic Form  |  1995-11-26  |  122.1 KB  |  3,315 lines

  1. VERSION 4.00
  2. Begin VB.Form frm3DMaze 
  3.    BackColor       =   &H00FFFFFF&
  4.    Caption         =   "3DMaze"
  5.    ClientHeight    =   4464
  6.    ClientLeft      =   1560
  7.    ClientTop       =   1980
  8.    ClientWidth     =   6000
  9.    Height          =   5136
  10.    Icon            =   "3dmaze.frx":0000
  11.    KeyPreview      =   -1  'True
  12.    Left            =   1512
  13.    LinkTopic       =   "Form1"
  14.    ScaleHeight     =   4464
  15.    ScaleWidth      =   6000
  16.    Top             =   1356
  17.    Width           =   6096
  18.    Begin VB.TextBox Text1 
  19.       BackColor       =   &H00FFFFFF&
  20.       BorderStyle     =   0  'None
  21.       Height          =   288
  22.       Left            =   0
  23.       Locked          =   -1  'True
  24.       TabIndex        =   1
  25.       Top             =   4200
  26.       Width           =   6012
  27.    End
  28.    Begin VB.VScrollBar VScroll1 
  29.       Height          =   4212
  30.       LargeChange     =   5
  31.       Left            =   5760
  32.       Max             =   60
  33.       Min             =   30
  34.       TabIndex        =   0
  35.       Top             =   0
  36.       Value           =   45
  37.       Width           =   252
  38.    End
  39.    Begin VB.Timer Timer1 
  40.       Enabled         =   0   'False
  41.       Interval        =   55
  42.       Left            =   0
  43.       Top             =   0
  44.    End
  45.    Begin VB.Menu mnuAction 
  46.       Caption         =   "&Action"
  47.       Begin VB.Menu mnuActionItem 
  48.          Caption         =   "&New"
  49.          Index           =   0
  50.       End
  51.       Begin VB.Menu mnuActionItem 
  52.          Caption         =   "&Solve"
  53.          Enabled         =   0   'False
  54.          Index           =   1
  55.       End
  56.       Begin VB.Menu mnuActionItem 
  57.          Caption         =   "&Clear"
  58.          Enabled         =   0   'False
  59.          Index           =   2
  60.       End
  61.       Begin VB.Menu mnuActionItem 
  62.          Caption         =   "-"
  63.          Index           =   3
  64.       End
  65.       Begin VB.Menu mnuActionItem 
  66.          Caption         =   "E&xit"
  67.          Index           =   4
  68.       End
  69.    End
  70.    Begin VB.Menu mnuStyle 
  71.       Caption         =   "&Style"
  72.       Begin VB.Menu mnuStyleItem 
  73.          Caption         =   "&Hexagonal rooms"
  74.          Index           =   0
  75.       End
  76.       Begin VB.Menu mnuStyleItem 
  77.          Caption         =   "&Square rooms"
  78.          Index           =   1
  79.       End
  80.    End
  81.    Begin VB.Menu mnuHelp 
  82.       Caption         =   "&Help"
  83.       Begin VB.Menu mnuHelpItem 
  84.          Caption         =   "&About..."
  85.          Index           =   0
  86.       End
  87.    End
  88. Attribute VB_Name = "frm3DMaze"
  89. Attribute VB_Creatable = False
  90. Attribute VB_Exposed = False
  91. Option Explicit
  92. Private Type CornerRec
  93.   X As Long
  94.   Y As Long
  95. End Type
  96. Private Type VertexRec
  97.   X As Double
  98.   Y As Double
  99. End Type
  100. Private Type StackRec
  101.   Index1 As Byte
  102.   Index2 As Integer
  103. End Type
  104. Private Type PALETTEENTRY
  105.   peRed As Byte
  106.   peGreen As Byte
  107.   peBlue As Byte
  108.   peFlags As Byte
  109. End Type
  110. Private Type LOGPALETTE
  111.   palVersion As Integer
  112.   palNumEntries As Integer
  113.   palPalEntry(16) As PALETTEENTRY
  114. End Type
  115. Private Declare Function CreatePalette Lib "GDI32" (LogicalPalette As LOGPALETTE) As Long
  116. Private Declare Function CreatePen Lib "GDI32" (ByVal PenStyle As Long, ByVal Width As Long, ByVal Color As Long) As Long
  117. Private Declare Function CreatePolygonRgn Lib "GDI32" (lpPoints As Any, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
  118. Private Declare Function CreateSolidBrush Lib "GDI32" (ByVal rgbColor As Long) As Long
  119. Private Declare Function DeleteObject Lib "GDI32" (ByVal hndobj As Long) As Long
  120. Private Declare Function FillRgn Lib "GDI32" (ByVal hDC As Long, ByVal hRegion As Long, ByVal hBrush As Long) As Long
  121. Private Declare Function GetDeviceCaps Lib "GDI32" (ByVal hDC As Long, ByVal Index As Long) As Long
  122. Private Declare Function LineTo Lib "GDI32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long) As Long
  123. Private Declare Function MoveToEx Lib "GDI32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long, ByVal NullPtr As Long) As Long
  124. Private Declare Function RealizePalette Lib "GDI32" (ByVal hDC As Long) As Long
  125. Private Declare Function SelectPalette Lib "GDI32" (ByVal hDC As Long, ByVal PaletteHandle As Long, ByVal Background As Long) As Long
  126. Private Declare Function SelectObject Lib "GDI32" (ByVal hDC As Long, ByVal ObjectHandle As Long) As Long
  127. Const PLANES = 14
  128. Const BITSPIXEL = 12
  129. Const PC_NOCOLLAPSE = 4
  130. Const COLORS = 24
  131. Const PS_SOLID = 0
  132. Const NumColors = 16
  133. Const TopColor = 12: ' all but last 3 colors are gray
  134. Const RectangleSENWColor = 10
  135. Const TriangleSSENNWColor = 9
  136. Const TriangleSENWColor = 8
  137. Const RectangleWEColor = 7
  138. Const FloorColor = 6
  139. Const TriangleSWNEColor = 5
  140. Const RectangleSWNEColor = 4
  141. Const TriangleSSWNNEColor = 3
  142. Const BackoutColor = 13
  143. Const AdvanceColor = 14
  144. Const SolutionColor = 15
  145. Const RelativeWidthOfWall = 0.25: ' relative to side of hexagon or square
  146. Const RelativeHeightOfWall = 2#: ' relative to side of hexagon or square
  147. Const MinWallLengthInInches = 0.25
  148. Const SecondsForMazeSelection = 0.25
  149. Dim AlreadyPainting As Boolean
  150. Dim BaseRectangle(5, 3) As VertexRec
  151. Dim BaseTriangle(3, 2) As VertexRec
  152. Dim ComputerPage() As Byte
  153. Dim CosTilt As Double
  154. Dim CurrentColor As Integer
  155. Dim HexDeltaX(5, 719) As Integer
  156. Dim HexDeltaY(5, 719) As Integer
  157. Dim MaxX As Integer
  158. Dim MaxY As Integer
  159. Dim Minimized As Boolean
  160. Dim NumColumns As Integer
  161. Dim NumRealized As Long
  162. Dim NumRoomsInMaze As Integer
  163. Dim NumRows As Integer
  164. Dim OldPaletteHandle As Long
  165. Dim Paint As Boolean
  166. Dim PaletteHandle As Long
  167. Dim PixelsPerX As Double
  168. Dim PixelsPerZ As Double
  169. Dim Rectangle(5, 3) As VertexRec
  170. Dim RedGreenBlue(16) As Long
  171. Dim RelDistOfUserFromScreen As Double
  172. Dim Resize As Boolean
  173. Dim Seed As String
  174. Dim SinTilt As Double
  175. Dim SolutionDisplayed As Boolean
  176. Dim SqrDeltaX(3, 23) As Integer
  177. Dim SqrDeltaY(3, 23) As Integer
  178. Dim Sqrt3 As Double
  179. Dim Stack() As StackRec
  180. Dim State As Byte
  181. Dim SubstitutionHigh(99) As Byte
  182. Dim SubstitutionLow(99) As Byte
  183. Dim Tilt As Double
  184. Dim UsePalette As Boolean
  185. Dim UserHasSolved As Boolean
  186. Dim UserPage() As Byte
  187. Dim UserX As Integer
  188. Dim UserXRelative As Double
  189. Dim UserY As Integer
  190. Dim UserYRelative As Double
  191. Dim X As Integer
  192. Dim XMax As Double
  193. Dim XOffset As Double
  194. Dim Y As Integer
  195. Dim YMax As Double
  196. Dim YMod4 As Byte
  197. Dim YOffset As Double
  198. Private Sub DrawQuadrilateral(Box() As CornerRec, ColorNum As Integer)
  199.   Dim Brush As Long
  200.   Dim rc As Long
  201.   Dim Region As Long
  202.   If UsePalette Then
  203.     Brush = CreateSolidBrush(16777216 + ColorNum)
  204.     If Brush Then
  205.       Region = CreatePolygonRgn(Box(0), 4, 1)
  206.       If Region Then
  207.         rc = FillRgn(frm3DMaze.hDC, Region, Brush)
  208.         rc = DeleteObject(Region)
  209.       End If
  210.       rc = DeleteObject(Brush)
  211.     End If
  212.   Else
  213.     Brush = CreateSolidBrush(RedGreenBlue(ColorNum))
  214.     If Brush Then
  215.       Region = CreatePolygonRgn(Box(0), 4, 1)
  216.       If Region Then
  217.         rc = FillRgn(frm3DMaze.hDC, Region, Brush)
  218.         rc = DeleteObject(Region)
  219.       End If
  220.       rc = DeleteObject(Brush)
  221.     End If
  222.   End If
  223. End Sub
  224. Private Sub GetCorner(X#, Y#, Z#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, Corner As CornerRec)
  225.   Dim XAdjusted As Double
  226.   Dim YPrime As Double
  227.   Dim ZAdjusted As Double
  228.   Dim ZPrime As Double
  229.   YPrime = (YMax# - Y#) * CosTilt# - Z# * SinTilt#
  230.   ZPrime = (YMax# - Y#) * SinTilt# + Z# * CosTilt#
  231.   ZAdjusted = (YMax# / 2#) + RelDistOfUserFromScreen# * (ZPrime - (YMax# / 2#)) / (YPrime + RelDistOfUserFromScreen#)
  232.   XAdjusted = (XMax# / 2#) + RelDistOfUserFromScreen# * (X# - (XMax# / 2#)) / (YPrime + RelDistOfUserFromScreen#)
  233.   XAdjusted = XAdjusted + XOffset#
  234.   Corner.X = Int(PixelsPerX# * XAdjusted)
  235.   Corner.Y = (ScaleHeight - Text1.Height) - Int(PixelsPerZ# * ZAdjusted)
  236. End Sub
  237. Private Sub DisplayQuadrilateral(XMax#, XOffset#, YMax#, X0#, Y0#, Z0#, X1#, Y1#, Z1#, X2#, Y2#, Z2#, X3#, Y3#, Z3#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, Shade%)
  238.   Dim Quadrilateral(3) As CornerRec
  239.   Dim TemQuad As CornerRec
  240.   Call GetCorner(X0#, Y0#, Z0#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemQuad)
  241.   Quadrilateral(0).X = TemQuad.X
  242.   Quadrilateral(0).Y = TemQuad.Y
  243.   Call GetCorner(X1#, Y1#, Z1#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemQuad)
  244.   Quadrilateral(1).X = TemQuad.X
  245.   Quadrilateral(1).Y = TemQuad.Y
  246.   Call GetCorner(X2#, Y2#, Z2#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemQuad)
  247.   Quadrilateral(2).X = TemQuad.X
  248.   Quadrilateral(2).Y = TemQuad.Y
  249.   Call GetCorner(X3#, Y3#, Z3#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemQuad)
  250.   Quadrilateral(3).X = TemQuad.X
  251.   Quadrilateral(3).Y = TemQuad.Y
  252.   Call DrawQuadrilateral(Quadrilateral(), Shade%)
  253. End Sub
  254. Private Sub DrawTriangle(Box() As CornerRec, ColorNum As Integer)
  255.   Dim Brush As Long
  256.   Dim rc As Long
  257.   Dim Region As Long
  258.   If UsePalette Then
  259.     Brush = CreateSolidBrush(16777216 + ColorNum)
  260.     If Brush Then
  261.       Region = CreatePolygonRgn(Box(0), 3, 1)
  262.       If Region Then
  263.         rc = FillRgn(frm3DMaze.hDC, Region, Brush)
  264.         rc = DeleteObject(Region)
  265.       End If
  266.       rc = DeleteObject(Brush)
  267.     End If
  268.   Else
  269.     Brush = CreateSolidBrush(RedGreenBlue(ColorNum))
  270.     If Brush Then
  271.       Region = CreatePolygonRgn(Box(0), 3, 1)
  272.       If Region Then
  273.         rc = FillRgn(frm3DMaze.hDC, Region, Brush)
  274.         rc = DeleteObject(Region)
  275.       End If
  276.       rc = DeleteObject(Brush)
  277.     End If
  278.   End If
  279. End Sub
  280. Private Sub DisplayTriangle(XMax#, XOffset#, YMax#, X0#, Y0#, Z0#, X1#, Y1#, Z1#, X2#, Y2#, Z2#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, Shade%)
  281.   Dim Triangle(2) As CornerRec
  282.   Dim TemTriangle As CornerRec
  283.   Call GetCorner(X0#, Y0#, Z0#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemTriangle)
  284.   Triangle(0).X = TemTriangle.X
  285.   Triangle(0).Y = TemTriangle.Y
  286.   Call GetCorner(X1#, Y1#, Z1#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemTriangle)
  287.   Triangle(1).X = TemTriangle.X
  288.   Triangle(1).Y = TemTriangle.Y
  289.   Call GetCorner(X2#, Y2#, Z2#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, XMax#, XOffset#, YMax#, TemTriangle)
  290.   Triangle(2).X = TemTriangle.X
  291.   Triangle(2).Y = TemTriangle.Y
  292.   Call DrawTriangle(Triangle(), Shade%)
  293. End Sub
  294. Private Sub OutputTriangle(XMax#, XOffset#, YMax#, Triangle() As VertexRec, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, FirstPass%, FaceColor%)
  295.   Dim X0 As Double
  296.   Dim X1 As Double
  297.   Dim X2 As Double
  298.   Dim X3 As Double
  299.   Dim Y0 As Double
  300.   Dim Y1 As Double
  301.   Dim Y2 As Double
  302.   Dim Y3 As Double
  303.   If FirstPass% Then
  304.     If ((Triangle(1).X < XMax# / 2#) And (Triangle(1).X > Triangle(0).X)) Then
  305.       X0 = Triangle(2).X
  306.       Y0 = Triangle(2).Y
  307.       X1 = Triangle(1).X
  308.       Y1 = Triangle(1).Y
  309.       X2 = Triangle(1).X
  310.       Y2 = Triangle(1).Y
  311.       X3 = Triangle(2).X
  312.       Y3 = Triangle(2).Y
  313.       Call DisplayQuadrilateral(XMax#, XOffset#, YMax#, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, TriangleSSWNNEColor)
  314.     End If
  315.     If ((Triangle(1).X > XMax# / 2#) And (Triangle(1).X < Triangle(2).X)) Then
  316.       X0 = Triangle(1).X
  317.       Y0 = Triangle(1).Y
  318.       X1 = Triangle(0).X
  319.       Y1 = Triangle(0).Y
  320.       X2 = Triangle(0).X
  321.       Y2 = Triangle(0).Y
  322.       X3 = Triangle(1).X
  323.       Y3 = Triangle(1).Y
  324.       Call DisplayQuadrilateral(XMax#, XOffset#, YMax#, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, TriangleSSENNWColor)
  325.     End If
  326.   Else
  327.     X0 = Triangle(0).X
  328.     Y0 = Triangle(0).Y
  329.     X1 = Triangle(2).X
  330.     Y1 = Triangle(2).Y
  331.     X2 = Triangle(2).X
  332.     Y2 = Triangle(2).Y
  333.     X3 = Triangle(0).X
  334.     Y3 = Triangle(0).Y
  335.     Call DisplayQuadrilateral(XMax#, XOffset#, YMax#, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, FaceColor%)
  336.     X0 = Triangle(0).X
  337.     Y0 = Triangle(0).Y
  338.     X1 = Triangle(1).X
  339.     Y1 = Triangle(1).Y
  340.     X2 = Triangle(2).X
  341.     Y2 = Triangle(2).Y
  342.     Call DisplayTriangle(XMax#, XOffset#, YMax#, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, RelativeHeightOfWall, PixelsPerX#, PixelsPerZ#, CosTilt#, SinTilt#, RelDistOfUserFromScreen#, TopColor)
  343.   End If
  344. End Sub
  345. Private Sub OutputRectangle(XMax As Double, XOffset As Double, YMax As Double, Rectangle() As VertexRec, PixelsPerX As Double, PixelsPerZ As Double, CosTilt As Double, SinTilt As Double, RelDistOfUserFromScreen As Double, FaceColor As Integer)
  346.   Dim X0 As Double
  347.   Dim X1 As Double
  348.   Dim X2 As Double
  349.   Dim X3 As Double
  350.   Dim Y0 As Double
  351.   Dim Y1 As Double
  352.   Dim Y2 As Double
  353.   Dim Y3 As Double
  354.   X0 = Rectangle(3).X
  355.   Y0 = Rectangle(3).Y
  356.   X1 = Rectangle(2).X
  357.   Y1 = Rectangle(2).Y
  358.   X2 = Rectangle(2).X
  359.   Y2 = Rectangle(2).Y
  360.   X3 = Rectangle(3).X
  361.   Y3 = Rectangle(3).Y
  362.   Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FaceColor)
  363.   X0 = Rectangle(0).X
  364.   Y0 = Rectangle(0).Y
  365.   X1 = Rectangle(1).X
  366.   Y1 = Rectangle(1).Y
  367.   X2 = Rectangle(2).X
  368.   Y2 = Rectangle(2).Y
  369.   X3 = Rectangle(3).X
  370.   Y3 = Rectangle(3).Y
  371.   Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, RelativeHeightOfWall, X3, Y3, RelativeHeightOfWall, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, TopColor)
  372. End Sub
  373. Private Sub OutputLeftRight(XMax As Double, XOffset As Double, YMax As Double, Rectangle() As VertexRec, PixelsPerX As Double, PixelsPerZ As Double, CosTilt As Double, SinTilt As Double, RelDistOfUserFromScreen As Double)
  374.   Dim X0 As Double
  375.   Dim X1 As Double
  376.   Dim X2 As Double
  377.   Dim X3 As Double
  378.   Dim Y0 As Double
  379.   Dim Y1 As Double
  380.   Dim Y2 As Double
  381.   Dim Y3 As Double
  382.   If 2# * Rectangle(0).X > XMax Then
  383.     X0 = Rectangle(0).X
  384.     Y0 = Rectangle(0).Y
  385.     X1 = Rectangle(3).X
  386.     Y1 = Rectangle(3).Y
  387.     X2 = Rectangle(3).X
  388.     Y2 = Rectangle(3).Y
  389.     X3 = Rectangle(0).X
  390.     Y3 = Rectangle(0).Y
  391.     Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSENWColor)
  392.   End If
  393.   If 2# * Rectangle(1).X < XMax Then
  394.     X0 = Rectangle(2).X
  395.     Y0 = Rectangle(2).Y
  396.     X1 = Rectangle(1).X
  397.     Y1 = Rectangle(1).Y
  398.     X2 = Rectangle(1).X
  399.     Y2 = Rectangle(1).Y
  400.     X3 = Rectangle(2).X
  401.     Y3 = Rectangle(2).Y
  402.     Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, RelativeHeightOfWall, X1, Y1, RelativeHeightOfWall, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSWNEColor)
  403.   End If
  404. End Sub
  405. Private Sub DrawLine(X1 As Double, Y1 As Double, X2 As Double, Y2 As Double, XMax As Double, XOffset As Double, YMax As Double, CosTilt As Double, SinTilt As Double, PixelsPerX As Double, PixelsPerZ As Double, RelDistOfUserFromScreen As Double)
  406.   Dim LineX1 As Long
  407.   Dim LineX2 As Long
  408.   Dim LineY1 As Long
  409.   Dim LineY2 As Long
  410.   Dim Pen As Long
  411.   Dim PreviousPen As Long
  412.   Dim rc As Long
  413.   Dim tem As CornerRec
  414.   Call GetCorner(X1, Y1, RelativeHeightOfWall, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, XMax, XOffset, YMax, tem)
  415.   LineX1 = tem.X
  416.   LineY1 = tem.Y
  417.   Call GetCorner(X2, Y2, RelativeHeightOfWall, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, XMax, XOffset, YMax, tem)
  418.   LineX2 = tem.X
  419.   LineY2 = tem.Y
  420.   If UsePalette Then
  421.     Pen = CreatePen(PS_SOLID, 2, 16777216 + CurrentColor)
  422.     If Pen Then
  423.       PreviousPen = SelectObject(frm3DMaze.hDC, Pen)
  424.       rc = MoveToEx(frm3DMaze.hDC, LineX1, LineY1, 0)
  425.       rc = LineTo(frm3DMaze.hDC, LineX2, LineY2)
  426.       rc = SelectObject(frm3DMaze.hDC, PreviousPen)
  427.       rc = DeleteObject(Pen)
  428.     End If
  429.   Else
  430.     Pen = CreatePen(PS_SOLID, 2, RedGreenBlue(CurrentColor))
  431.     If Pen Then
  432.       PreviousPen = SelectObject(frm3DMaze.hDC, Pen)
  433.       rc = MoveToEx(frm3DMaze.hDC, LineX1, LineY1, 0)
  434.       rc = LineTo(frm3DMaze.hDC, LineX2, LineY2)
  435.       rc = SelectObject(frm3DMaze.hDC, PreviousPen)
  436.       rc = DeleteObject(Pen)
  437.     End If
  438.   End If
  439. End Sub
  440. Private Sub Hash(Counter0 As Byte, Counter1 As Byte, Counter2 As Byte, Counter3 As Byte, Counter4 As Byte, Counter5 As Byte, Counter6 As Byte, Counter7 As Byte)
  441.   Dim Iteration As Byte
  442.   Dim Seed0 As Byte
  443.   Dim Seed1 As Byte
  444.   Dim Seed2 As Byte
  445.   Dim Seed3 As Byte
  446.   Dim Seed4 As Byte
  447.   Dim Seed5 As Byte
  448.   Dim Seed6 As Byte
  449.   Dim Seed7 As Byte
  450.   Dim SubstitutionIndex As Byte
  451.   Dim Tem0 As Byte
  452.   Dim Tem1 As Byte
  453.   Dim Tem2 As Byte
  454.   Seed0 = Counter0
  455.   Seed1 = Counter1
  456.   Seed2 = Counter2
  457.   Seed3 = Counter3
  458.   Seed4 = Counter4
  459.   Seed5 = Counter5
  460.   Seed6 = Counter6
  461.   Seed7 = Counter7
  462.   For Iteration = 1 To 8
  463.     SubstitutionIndex = 10 * Seed1 + Seed0
  464.     Tem0 = SubstitutionLow(SubstitutionIndex)
  465.     Tem1 = SubstitutionHigh(SubstitutionIndex)
  466.     SubstitutionIndex = 10 * Seed3 + Seed2
  467.     Seed0 = SubstitutionLow(SubstitutionIndex)
  468.     Tem2 = SubstitutionHigh(SubstitutionIndex)
  469.     SubstitutionIndex = 10 * Seed5 + Seed4
  470.     Seed2 = SubstitutionLow(SubstitutionIndex)
  471.     Seed1 = SubstitutionHigh(SubstitutionIndex)
  472.     SubstitutionIndex = 10 * Seed7 + Seed6
  473.     Seed5 = SubstitutionLow(SubstitutionIndex)
  474.     Seed7 = SubstitutionHigh(SubstitutionIndex)
  475.     Seed3 = Tem0
  476.     Seed6 = Tem1
  477.     Seed4 = Tem2
  478.   Next Iteration
  479.   Counter0 = Seed0
  480.   Counter1 = Seed1
  481.   Counter2 = Seed2
  482.   Counter3 = Seed3
  483.   Counter4 = Seed4
  484.   Counter5 = Seed5
  485.   Counter6 = Seed6
  486.   Counter7 = Seed7
  487. End Sub
  488. Private Sub Increment(Counter0 As Byte, Counter1 As Byte, Counter2 As Byte, Counter3 As Byte, Counter4 As Byte, Counter5 As Byte, Counter6 As Byte, Counter7 As Byte)
  489.   Dim tem As Byte
  490.   tem = Counter0 + 1
  491.   If tem <= 9 Then
  492.     Counter0 = tem
  493.   Else
  494.     Counter0 = 0
  495.     tem = Counter1 + 1
  496.     If tem <= 9 Then
  497.       Counter1 = tem
  498.     Else
  499.       Counter1 = 0
  500.       tem = Counter2 + 1
  501.       If tem <= 9 Then
  502.         Counter2 = tem
  503.       Else
  504.         Counter2 = 0
  505.         tem = Counter3 + 1
  506.         If tem <= 9 Then
  507.           Counter3 = tem
  508.         Else
  509.           Counter3 = 0
  510.           tem = Counter4 + 1
  511.           If tem <= 9 Then
  512.             Counter4 = tem
  513.           Else
  514.             Counter4 = 0
  515.             tem = Counter5 + 1
  516.             If tem <= 9 Then
  517.               Counter5 = tem
  518.             Else
  519.               Counter5 = 0
  520.               tem = Counter6 + 1
  521.               If tem <= 9 Then
  522.                 Counter6 = tem
  523.               Else
  524.                 Counter6 = 0
  525.                 tem = Counter7 + 1
  526.                 If tem <= 9 Then
  527.                   Counter7 = tem
  528.                 Else
  529.                   Counter7 = 0
  530.                 End If
  531.               End If
  532.             End If
  533.           End If
  534.         End If
  535.       End If
  536.     End If
  537.   End If
  538. End Sub
  539. Private Sub HexDisplaySolution(MaxY As Integer, Page() As Byte, XMax As Double, XOffset As Double, YMax As Double, CosTilt As Double, SinTilt As Double, PixelsPerX As Double, PixelsPerZ As Double, RelDistOfUserFromScreen As Double)
  540.   Dim DeltaIndex As Byte
  541.   Dim OldPaletteHandle As Long
  542.   Dim PathFound As Integer
  543.   Dim X As Integer
  544.   Dim XNext As Integer
  545.   Dim XPrevious As Integer
  546.   Dim XRelative As Double
  547.   Dim XRelativeNext As Double
  548.   Dim Y As Integer
  549.   Dim YNext As Integer
  550.   Dim YPrevious As Integer
  551.   Dim YRelative As Double
  552.   Dim YRelativeNext As Double
  553.   If UsePalette Then
  554.     OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  555.     NumRealized = RealizePalette(frm3DMaze.hDC)
  556.   End If
  557.   XRelative = 1#
  558.   YRelative = Sqrt3 / 2#
  559.   CurrentColor = SolutionColor
  560.   Call DrawLine(1#, 0#, XRelative, YRelative, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  561.   XPrevious = 3
  562.   YPrevious = -2
  563.   X = 3
  564.   Y = 2
  565.     PathFound = False
  566.     DeltaIndex = 0
  567.     Do While (Not PathFound)
  568.       XNext = X + HexDeltaX(DeltaIndex, 0)
  569.       YNext = Y + HexDeltaY(DeltaIndex, 0)
  570.       If Page(YNext, XNext) = 1 Then
  571.         XNext = XNext + HexDeltaX(DeltaIndex, 0)
  572.         YNext = YNext + HexDeltaY(DeltaIndex, 0)
  573.         If (XNext <> XPrevious) Or (YNext <> YPrevious) Then
  574.           PathFound = True
  575.         Else
  576.           DeltaIndex = DeltaIndex + 1
  577.         End If
  578.       Else
  579.         DeltaIndex = DeltaIndex + 1
  580.       End If
  581.     Loop
  582.     If YNext < MaxY Then
  583.       Select Case YNext - Y
  584.         Case -4
  585.           XRelativeNext = XRelative
  586.           YRelativeNext = YRelative - Sqrt3
  587.         Case -2
  588.           If XNext > X Then
  589.             XRelativeNext = XRelative + 3# / 2#
  590.             YRelativeNext = YRelative - Sqrt3 / 2#
  591.           Else
  592.             XRelativeNext = XRelative - 3# / 2#
  593.             YRelativeNext = YRelative - Sqrt3 / 2#
  594.           End If
  595.         Case 2
  596.           If XNext > X Then
  597.             XRelativeNext = XRelative + 3# / 2#
  598.             YRelativeNext = YRelative + Sqrt3 / 2#
  599.           Else
  600.             XRelativeNext = XRelative - 3# / 2#
  601.             YRelativeNext = YRelative + Sqrt3 / 2#
  602.           End If
  603.         Case Else
  604.           XRelativeNext = XRelative
  605.           YRelativeNext = YRelative + Sqrt3
  606.       End Select
  607.       Call DrawLine(XRelative, YRelative, XRelativeNext, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  608.     Else
  609.       Call DrawLine(XRelative, YRelative, XRelative, YMax, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  610.     End If
  611.     XPrevious = X
  612.     YPrevious = Y
  613.     X = XNext
  614.     Y = YNext
  615.     XRelative = XRelativeNext
  616.     YRelative = YRelativeNext
  617.   Loop While YNext < MaxY
  618.   If UsePalette Then
  619.     NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  620.   End If
  621. End Sub
  622. Private Sub HexDisplayUserMoves(MaxX As Integer, MaxY As Integer, Page() As Byte, XMax As Double, XOffset As Double, YMax As Double, CosTilt As Double, SinTilt As Double, PixelsPerX As Double, PixelsPerZ As Double, RelDistOfUserFromScreen As Double)
  623.   Dim DeltaIndex As Byte
  624.   Dim EvenRow As Boolean
  625.   Dim OldPaletteHandle As Long
  626.   Dim X As Integer
  627.   Dim XNext As Integer
  628.   Dim XNextNext As Integer
  629.   Dim XRelative As Double
  630.   Dim XRelativeNext As Double
  631.   Dim Y As Integer
  632.   Dim YNext As Integer
  633.   Dim YNextNext As Integer
  634.   Dim YRelative As Double
  635.   Dim YRelativeNext As Double
  636.   If UsePalette Then
  637.     OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  638.     NumRealized = RealizePalette(frm3DMaze.hDC)
  639.   End If
  640.   Y = 2
  641.   YRelative = Sqrt3 / 2#
  642.   EvenRow = False
  643.   Do While (Y < MaxY)
  644.     If EvenRow Then
  645.       X = 7
  646.       XRelative = 2.5
  647.     Else
  648.       X = 3
  649.       XRelative = 1#
  650.     End If
  651.     Do While (X < MaxX)
  652.       If ((Page(Y, X) = 1) Or (Page(Y, X) = 3)) Then
  653.         For DeltaIndex = 0 To 5
  654.           XNext = X + HexDeltaX(DeltaIndex, 0)
  655.           YNext = Y + HexDeltaY(DeltaIndex, 0)
  656.           If Page(YNext, XNext) <> 0 Then
  657.             If YNext = 0 Then
  658.               CurrentColor = AdvanceColor
  659.               Call DrawLine(1#, 0#, XRelative, YRelative, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  660.             Else
  661.               If YNext = MaxY Then
  662.                 If UserHasSolved Then
  663.                   CurrentColor = AdvanceColor
  664.                   YRelativeNext = YRelative + Sqrt3 / 2#
  665.                   Call DrawLine(XRelative, YRelative, XRelative, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  666.                 End If
  667.               Else
  668.                 XNextNext = XNext + HexDeltaX(DeltaIndex, 0)
  669.                 If XNextNext > 0 Then
  670.                   If XNextNext < MaxX Then
  671.                     YNextNext = YNext + HexDeltaY(DeltaIndex, 0)
  672.                     If YNextNext > 0 Then
  673.                       If YNextNext < MaxY Then
  674.                         If ((Page(YNextNext, XNextNext) = 1) Or (Page(YNextNext, XNextNext) = 3)) Then
  675.                           If Page(Y, X) = Page(YNextNext, XNextNext) Then
  676.                             If Page(Y, X) = 1 Then
  677.                               CurrentColor = AdvanceColor
  678.                             Else
  679.                               CurrentColor = BackoutColor
  680.                             End If
  681.                           Else
  682.                             CurrentColor = BackoutColor
  683.                           End If
  684.                           Select Case (YNext - Y)
  685.                             Case -2
  686.                               XRelativeNext = XRelative
  687.                               YRelativeNext = YRelative - Sqrt3 / 2#
  688.                             Case -1
  689.                               If XNext > X Then
  690.                                 XRelativeNext = XRelative + 3# / 4#
  691.                                 YRelativeNext = YRelative - Sqrt3 / 4#
  692.                               Else
  693.                                 XRelativeNext = XRelative - 3# / 4#
  694.                                 YRelativeNext = YRelative - Sqrt3 / 4#
  695.                               End If
  696.                             Case 1
  697.                               If XNext > X Then
  698.                                 XRelativeNext = XRelative + 3# / 4#
  699.                                 YRelativeNext = YRelative + Sqrt3 / 4#
  700.                               Else
  701.                                 XRelativeNext = XRelative - 3# / 4#
  702.                                 YRelativeNext = YRelative + Sqrt3 / 4#
  703.                               End If
  704.                             Case Else
  705.                               XRelativeNext = XRelative
  706.                               YRelativeNext = YRelative + Sqrt3 / 2#
  707.                           End Select
  708.                           Call DrawLine(XRelative, YRelative, XRelativeNext, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  709.                         End If
  710.                        End If
  711.                     End If
  712.                   End If
  713.                 End If
  714.               End If
  715.             End If
  716.           End If
  717.         Next DeltaIndex
  718.       End If
  719.       XRelative = XRelative + 3#
  720.       X = X + 8
  721.     Loop
  722.     EvenRow = Not EvenRow
  723.     YRelative = YRelative + Sqrt3 / 2#
  724.     Y = Y + 2
  725.   Loop
  726.   If UsePalette Then
  727.     NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  728.   End If
  729. End Sub
  730. Private Sub HexSolveMaze(Stack() As StackRec, Page() As Byte, NumRoomsInSolution As Integer, Adjacency As Integer, MaxX As Integer, MaxY As Integer)
  731.   Dim DeltaIndex As Byte
  732.   Dim PassageFound As Integer
  733.   Dim StackHead As Integer
  734.   Dim X As Integer
  735.   Dim XNext As Integer
  736.   Dim Y As Integer
  737.   Dim YNext As Integer
  738.   NumRoomsInSolution = 1
  739.   Adjacency = 0
  740.   X = 3
  741.   Y = 2
  742.   StackHead = -1
  743.   Page(Y, X) = 1
  744.     DeltaIndex = 0
  745.     PassageFound = False
  746.     Do
  747.       Do While ((DeltaIndex < 6) And (Not PassageFound))
  748.         XNext = X + HexDeltaX(DeltaIndex, 0)
  749.         YNext = Y + HexDeltaY(DeltaIndex, 0)
  750.         If Page(YNext, XNext) = 2 Then
  751.           PassageFound = True
  752.         Else
  753.           DeltaIndex = DeltaIndex + 1
  754.         End If
  755.       Loop
  756.       If Not PassageFound Then
  757.         DeltaIndex = Stack(StackHead).Index1
  758.         Page(Y, X) = 2
  759.         X = X - HexDeltaX(DeltaIndex, 0)
  760.         Y = Y - HexDeltaY(DeltaIndex, 0)
  761.         Page(Y, X) = 2
  762.         X = X - HexDeltaX(DeltaIndex, 0)
  763.         Y = Y - HexDeltaY(DeltaIndex, 0)
  764.         StackHead = StackHead - 1
  765.         DeltaIndex = DeltaIndex + 1
  766.       End If
  767.     Loop While Not PassageFound
  768.     Page(YNext, XNext) = 1
  769.     XNext = XNext + HexDeltaX(DeltaIndex, 0)
  770.     YNext = YNext + HexDeltaY(DeltaIndex, 0)
  771.     If YNext <= MaxY Then
  772.       StackHead = StackHead + 1
  773.       Stack(StackHead).Index1 = DeltaIndex
  774.       Page(YNext, XNext) = 1
  775.       X = XNext
  776.       Y = YNext
  777.     End If
  778.   Loop While YNext < MaxY
  779.   X = MaxX - 3
  780.   Y = MaxY - 2
  781.   Adjacency = 0
  782.   Do While (StackHead >= 0)
  783.     For DeltaIndex = 0 To 5
  784.       XNext = X + HexDeltaX(DeltaIndex, 0)
  785.       YNext = Y + HexDeltaY(DeltaIndex, 0)
  786.       If Page(YNext, XNext) <> 1 Then
  787.         If Page(YNext, XNext) = 0 Then
  788.           XNext = XNext + HexDeltaX(DeltaIndex, 0)
  789.           YNext = YNext + HexDeltaY(DeltaIndex, 0)
  790.           If XNext < 0 Then
  791.             Adjacency = Adjacency + 1
  792.           Else
  793.             If XNext > MaxX Then
  794.               Adjacency = Adjacency + 1
  795.             Else
  796.               If YNext < 0 Then
  797.                 Adjacency = Adjacency + 1
  798.               Else
  799.                 If YNext > MaxY Then
  800.                   Adjacency = Adjacency + 1
  801.                 Else
  802.                   If Page(YNext, XNext) = 1 Then
  803.                     Adjacency = Adjacency + 1
  804.                   End If
  805.                 End If
  806.               End If
  807.             End If
  808.           End If
  809.         End If
  810.       End If
  811.     Next DeltaIndex
  812.     X = X - 2 * HexDeltaX(Stack(StackHead).Index1, 0)
  813.     Y = Y - 2 * HexDeltaY(Stack(StackHead).Index1, 0)
  814.     StackHead = StackHead - 1
  815.     NumRoomsInSolution = NumRoomsInSolution + 1
  816.   Loop
  817.   For DeltaIndex = 0 To 5
  818.     XNext = X + HexDeltaX(DeltaIndex, 0)
  819.     YNext = X + HexDeltaY(DeltaIndex, 0)
  820.     If Page(YNext, XNext) <> 2 Then
  821.       If Page(YNext, XNext) = 0 Then
  822.         XNext = XNext + HexDeltaX(DeltaIndex, 0)
  823.         YNext = YNext + HexDeltaY(DeltaIndex, 0)
  824.         If XNext < 0 Then
  825.           Adjacency = Adjacency + 1
  826.         Else
  827.           If XNext > MaxX Then
  828.             Adjacency = Adjacency + 1
  829.           Else
  830.             If YNext < 0 Then
  831.               Adjacency = Adjacency + 1
  832.             Else
  833.               If YNext > MaxY Then
  834.                 Adjacency = Adjacency + 1
  835.               Else
  836.                 If Page(YNext, XNext) = 1 Then
  837.                   Adjacency = Adjacency + 1
  838.                 End If
  839.               End If
  840.             End If
  841.           End If
  842.         End If
  843.       End If
  844.     End If
  845.   Next DeltaIndex
  846. End Sub
  847. Private Sub HexGenerateMaze(Page() As Byte, MaxX As Integer, MaxY As Integer, Stack() As StackRec, NumColumns As Integer, NumRows As Integer, Seed() As Byte)
  848.   Dim ColumnNum As Integer
  849.   Dim DeltaIndex1 As Integer
  850.   Dim DeltaIndex2 As Integer
  851.   Dim PassageFound As Integer
  852.   Dim RN(7) As Integer
  853.   Dim RNIndex1 As Integer
  854.   Dim RNIndex2 As Integer
  855.   Dim RowNum As Integer
  856.   Dim SearchComplete As Integer
  857.   Dim StackHead As Integer
  858.   Dim TemInt As Integer
  859.   Dim X As Integer
  860.   Dim XMod8 As Byte
  861.   Dim XNext As Integer
  862.   Dim Y As Integer
  863.   Dim YMod4 As Byte
  864.   Dim YNext As Integer
  865.   RN(0) = Seed(0) + 1
  866.   RN(1) = Seed(1) + 1
  867.   RN(2) = Seed(2) + 1
  868.   RN(3) = Seed(3) + 1
  869.   RN(4) = Seed(4) + 1
  870.   RN(5) = Seed(5) + 1
  871.   RN(6) = Seed(6) + 1
  872.   RN(7) = Seed(7) + 1
  873.   YMod4 = 1
  874.   For Y = 0 To MaxY
  875.     If YMod4 = 1 Then
  876.       XMod8 = 1
  877.       For X = 0 To MaxX
  878.         If (((XMod8 = 0) And (Y <> 0) And (Y <> MaxY)) Or (XMod8 = 3) Or (XMod8 = 4) Or (XMod8 = 5)) Then
  879.           Page(Y, X) = 0
  880.         Else
  881.           Page(Y, X) = 2
  882.         End If
  883.         XMod8 = XMod8 + 1
  884.         If XMod8 >= 8 Then XMod8 = 0
  885.       Next X
  886.     Else
  887.       If YMod4 = 0 Or YMod4 = 2 Then
  888.         XMod8 = 1
  889.         For X = 0 To MaxX
  890.           If (XMod8 = 2) Or (XMod8 = 6) Then
  891.             Page(Y, X) = 0
  892.           Else
  893.             Page(Y, X) = 2
  894.           End If
  895.           XMod8 = XMod8 + 1
  896.           If XMod8 >= 8 Then XMod8 = 0
  897.         Next X
  898.       Else
  899.         XMod8 = 1
  900.         For X = 0 To MaxX
  901.           If (XMod8 = 0) Or (XMod8 = 1) Or (XMod8 = 4) Or (XMod8 = 7) Then
  902.             Page(Y, X) = 0
  903.           Else
  904.             Page(Y, X) = 2
  905.           End If
  906.           XMod8 = XMod8 + 1
  907.           If XMod8 >= 8 Then XMod8 = 0
  908.         Next X
  909.       End If
  910.     End If
  911.     YMod4 = YMod4 + 1
  912.     If YMod4 >= 4 Then YMod4 = 0
  913.   Next Y
  914.   ColumnNum = RN(0)
  915.   RNIndex1 = 0
  916.   RNIndex2 = 1
  917.   Do While (RNIndex2 < 8)
  918.     TemInt = RN(RNIndex2)
  919.     RN(RNIndex1) = TemInt
  920.     ColumnNum = ColumnNum + TemInt
  921.     If ColumnNum >= 727 Then ColumnNum = ColumnNum - 727
  922.     RNIndex1 = RNIndex2
  923.     RNIndex2 = RNIndex2 + 1
  924.   Loop
  925.   RN(7) = ColumnNum
  926.   ColumnNum = ColumnNum Mod NumColumns
  927.   X = 4 * ColumnNum + 3
  928.   RowNum = RN(0)
  929.   RNIndex1 = 0
  930.   RNIndex2 = 1
  931.   Do While (RNIndex2 < 8)
  932.     TemInt = RN(RNIndex2)
  933.     RN(RNIndex1) = TemInt
  934.     RowNum = RowNum + TemInt
  935.     If RowNum >= 727 Then RowNum = RowNum - 727
  936.     RNIndex1 = RNIndex2
  937.     RNIndex2 = RNIndex2 + 1
  938.   Loop
  939.   RN(7) = RowNum
  940.   If ColumnNum Mod 2 Then
  941.     RowNum = RowNum Mod (NumRows - 1)
  942.     Y = 4 * RowNum + 4
  943.   Else
  944.     RowNum = RowNum Mod NumRows
  945.     Y = 4 * RowNum + 2
  946.   End If
  947.   Page(Y, X) = 2
  948.   StackHead = -1
  949.     DeltaIndex1 = 0
  950.     Do
  951.       DeltaIndex2 = RN(0)
  952.       RNIndex1 = 0
  953.       RNIndex2 = 1
  954.       Do While (RNIndex2 < 8)
  955.         TemInt = RN(RNIndex2)
  956.         RN(RNIndex1) = TemInt
  957.         DeltaIndex2 = DeltaIndex2 + TemInt
  958.         If DeltaIndex2 >= 727 Then DeltaIndex2 = DeltaIndex2 - 727
  959.         RNIndex1 = RNIndex2
  960.         RNIndex2 = RNIndex2 + 1
  961.       Loop
  962.       RN(7) = DeltaIndex2
  963.     Loop While DeltaIndex2 >= 720
  964.     PassageFound = False
  965.     SearchComplete = False
  966.     Do While (Not SearchComplete)
  967.       Do While ((DeltaIndex1 < 6) And (Not PassageFound))
  968.         XNext = X + 2 * HexDeltaX(DeltaIndex1, DeltaIndex2)
  969.         If XNext <= 0 Then
  970.           DeltaIndex1 = DeltaIndex1 + 1
  971.         Else
  972.           If XNext > MaxX Then
  973.             DeltaIndex1 = DeltaIndex1 + 1
  974.           Else
  975.             YNext = Y + 2 * HexDeltaY(DeltaIndex1, DeltaIndex2)
  976.             If YNext <= 0 Then
  977.               DeltaIndex1 = DeltaIndex1 + 1
  978.             Else
  979.               If YNext > MaxY Then
  980.                 DeltaIndex1 = DeltaIndex1 + 1
  981.               Else
  982.                 If Page(YNext, XNext) = 0 Then
  983.                   PassageFound = True
  984.                 Else
  985.                   DeltaIndex1 = DeltaIndex1 + 1
  986.                 End If
  987.               End If
  988.             End If
  989.           End If
  990.         End If
  991.       Loop
  992.       If Not PassageFound Then
  993.         If StackHead >= 0 Then
  994.           DeltaIndex1 = Stack(StackHead).Index1
  995.           DeltaIndex2 = Stack(StackHead).Index2
  996.           X = X - 2 * HexDeltaX(DeltaIndex1, DeltaIndex2)
  997.           Y = Y - 2 * HexDeltaY(DeltaIndex1, DeltaIndex2)
  998.           StackHead = StackHead - 1
  999.           DeltaIndex1 = DeltaIndex1 + 1
  1000.         End If
  1001.       End If
  1002.       If ((PassageFound) Or ((StackHead = -1) And (DeltaIndex1 >= 6))) Then
  1003.         SearchComplete = True
  1004.       Else
  1005.         SearchComplete = False
  1006.       End If
  1007.     Loop
  1008.     If PassageFound Then
  1009.       StackHead = StackHead + 1
  1010.       Stack(StackHead).Index1 = DeltaIndex1
  1011.       Stack(StackHead).Index2 = DeltaIndex2
  1012.       Page(YNext, XNext) = 2
  1013.       Page((Y + YNext) \ 2, (X + XNext) \ 2) = 2
  1014.       X = XNext
  1015.       Y = YNext
  1016.     End If
  1017.   Loop While StackHead <> -1
  1018.   Page(0, 3) = 1
  1019.   Page(MaxY, MaxX - 3) = 2
  1020. End Sub
  1021. Private Sub HexSelectMaze(Seed As String, Page() As Byte, MaxX As Integer, MaxY As Integer, Stack() As StackRec, NumRoomsInMaze As Integer, NumColumns As Integer, NumRows As Integer, SecondsForMazeSelection As Double)
  1022.   Dim Adjacency As Integer
  1023.   Dim Counter0 As Byte
  1024.   Dim Counter1 As Byte
  1025.   Dim Counter2 As Byte
  1026.   Dim Counter3 As Byte
  1027.   Dim Counter4 As Byte
  1028.   Dim Counter5 As Byte
  1029.   Dim Counter6 As Byte
  1030.   Dim Counter7 As Byte
  1031.   Dim ElapsedTime As Double
  1032.   Dim MinAdjacency As Integer
  1033.   Dim NumRoomsInSolution As Integer
  1034.   Dim NumRoomsInSolutionAtMin As Integer
  1035.   Dim RN(7) As Integer
  1036.   Dim RNIndex1 As Integer
  1037.   Dim RNIndex2 As Integer
  1038.   Dim SeedByte(7) As Byte
  1039.   Dim SeedByteAtMin(7) As Byte
  1040.   Dim SeedLength As Integer
  1041.   Dim StartTime As Double
  1042.   SeedLength = Len(Seed)
  1043.   If SeedLength > 8 Then SeedLength = 8
  1044.   RNIndex1 = 0
  1045.   For RNIndex2 = 1 To SeedLength
  1046.     RN(RNIndex1) = Asc(Mid$(Seed, RNIndex2, 1)) Mod 10
  1047.     RNIndex1 = RNIndex1 + 1
  1048.   Next RNIndex2
  1049.   RNIndex2 = 7
  1050.   Do While (RNIndex1 > 0)
  1051.     RNIndex1 = RNIndex1 - 1
  1052.     RN(RNIndex2) = RN(RNIndex1)
  1053.     RNIndex2 = RNIndex2 - 1
  1054.   Loop
  1055.   Do While (RNIndex2 >= 0)
  1056.     RN(RNIndex2) = 8
  1057.     RNIndex2 = RNIndex2 - 1
  1058.   Loop
  1059.   Counter0 = RN(0)
  1060.   Counter1 = RN(1)
  1061.   Counter2 = RN(2)
  1062.   Counter3 = RN(3)
  1063.   Counter4 = RN(4)
  1064.   Counter5 = RN(5)
  1065.   Counter6 = RN(6)
  1066.   Counter7 = RN(7)
  1067.   Call Hash(Counter0, Counter1, Counter2, Counter3, Counter4, Counter5, Counter6, Counter7)
  1068.   MinAdjacency = 4 * NumRoomsInMaze + 1
  1069.   NumRoomsInSolutionAtMin = 0
  1070.   SeedByteAtMin(0) = Counter0
  1071.   SeedByteAtMin(1) = Counter1
  1072.   SeedByteAtMin(2) = Counter2
  1073.   SeedByteAtMin(3) = Counter3
  1074.   SeedByteAtMin(4) = Counter4
  1075.   SeedByteAtMin(5) = Counter5
  1076.   SeedByteAtMin(6) = Counter6
  1077.   SeedByteAtMin(7) = Counter7
  1078.   StartTime = Timer
  1079.     SeedByte(0) = Counter0
  1080.     SeedByte(1) = Counter1
  1081.     SeedByte(2) = Counter2
  1082.     SeedByte(3) = Counter3
  1083.     SeedByte(4) = Counter4
  1084.     SeedByte(5) = Counter5
  1085.     SeedByte(6) = Counter6
  1086.     SeedByte(7) = Counter7
  1087.     Call HexGenerateMaze(Page(), MaxX, MaxY, Stack(), NumColumns, NumRows, SeedByte())
  1088.     Call HexSolveMaze(Stack(), Page(), NumRoomsInSolution, Adjacency, MaxX, MaxY)
  1089.     If 3 * NumRoomsInSolution >= NumRoomsInMaze Then
  1090.       If Adjacency < MinAdjacency Then
  1091.         MinAdjacency = Adjacency
  1092.         NumRoomsInSolutionAtMin = NumRoomsInSolution
  1093.         SeedByteAtMin(0) = SeedByte(0)
  1094.         SeedByteAtMin(1) = SeedByte(1)
  1095.         SeedByteAtMin(2) = SeedByte(2)
  1096.         SeedByteAtMin(3) = SeedByte(3)
  1097.         SeedByteAtMin(4) = SeedByte(4)
  1098.         SeedByteAtMin(5) = SeedByte(5)
  1099.         SeedByteAtMin(6) = SeedByte(6)
  1100.         SeedByteAtMin(7) = SeedByte(7)
  1101.       Else
  1102.         If Adjacency = MinAdjacency Then
  1103.           If NumRoomsInSolution > NumRoomsInSolutionAtMin Then
  1104.             NumRoomsInSolutionAtMin = NumRoomsInSolution
  1105.             SeedByteAtMin(0) = SeedByte(0)
  1106.             SeedByteAtMin(1) = SeedByte(1)
  1107.             SeedByteAtMin(2) = SeedByte(2)
  1108.             SeedByteAtMin(3) = SeedByte(3)
  1109.             SeedByteAtMin(4) = SeedByte(4)
  1110.             SeedByteAtMin(5) = SeedByte(5)
  1111.             SeedByteAtMin(6) = SeedByte(6)
  1112.             SeedByteAtMin(7) = SeedByte(7)
  1113.           End If
  1114.         End If
  1115.       End If
  1116.     End If
  1117.     Call Increment(Counter0, Counter1, Counter2, Counter3, Counter4, Counter5, Counter6, Counter7)
  1118.     ElapsedTime = Timer - StartTime
  1119.   Loop While ((ElapsedTime >= 0#) And (ElapsedTime < SecondsForMazeSelection))
  1120.   Call HexGenerateMaze(Page(), MaxX, MaxY, Stack(), NumColumns, NumRows, SeedByteAtMin())
  1121.   Call HexSolveMaze(Stack(), Page(), NumRoomsInSolution, Adjacency, MaxX, MaxY)
  1122. End Sub
  1123. Private Sub HexOutputMaze()
  1124.   Dim ObjectNum As Byte
  1125.   Dim Radians As Double
  1126.   Dim RadiansPerDegree As Double
  1127.   Dim SingleRectangle(3) As VertexRec
  1128.   Dim SingleTriangle(2) As VertexRec
  1129.   Dim TemDouble1 As Double
  1130.   Dim TemDouble2 As Double
  1131.   Dim TemDouble3 As Double
  1132.   Dim TemDouble4 As Double
  1133.   Dim Triangle(3, 2) As VertexRec
  1134.   Dim VertexNum As Byte
  1135.   Dim XMod8 As Byte
  1136.   Dim X0 As Double
  1137.   Dim X1 As Double
  1138.   Dim X2 As Double
  1139.   Dim X3 As Double
  1140.   Dim Y0 As Double
  1141.   Dim Y1 As Double
  1142.   Dim Y2 As Double
  1143.   Dim Y3 As Double
  1144.   Select Case State
  1145.     Case 0
  1146.       Text1.Text = ""
  1147.       ScaleMode = 1
  1148.       If (Resize) Then
  1149.         TemDouble1 = ScaleWidth - VScroll1.Width
  1150.         TemDouble2 = MinWallLengthInInches
  1151.         TemDouble2 = 1440# * TemDouble2
  1152.         TemDouble3 = RelativeWidthOfWall
  1153.         NumColumns = Int(2# * (TemDouble1 / TemDouble2 - 2# - TemDouble3 / Sqrt3) / 3# + 1#)
  1154.         If NumColumns Mod 2 = 0 Then NumColumns = NumColumns - 1
  1155.         If NumColumns < 3 Then NumColumns = 3
  1156.         TemDouble1 = ScaleHeight - Text1.Height
  1157.         TemDouble2 = ScaleWidth - VScroll1.Width
  1158.         ScaleMode = 3
  1159.         TemDouble3 = NumColumns
  1160.         TemDouble4 = RelativeWidthOfWall
  1161.         NumRows = Int(((TemDouble1 / TemDouble2) * (3# * (TemDouble3 - 1#) / 2# + 2# + TemDouble4 / Sqrt3) - TemDouble4) / Sqrt3)
  1162.         If NumRows < 2 Then NumRows = 2
  1163.         Tilt = 90 - VScroll1.Value
  1164.         MaxX = 8 * (NumColumns \ 2) + 6
  1165.         MaxY = 4 * NumRows
  1166.         NumRoomsInMaze = NumRows * NumColumns - (NumColumns \ 2)
  1167.         ReDim ComputerPage(MaxY, MaxX)
  1168.         ReDim UserPage(MaxY, MaxX)
  1169.         ReDim Stack(NumRoomsInMaze)
  1170.         Call HexSelectMaze(Seed, ComputerPage(), MaxX, MaxY, Stack(), NumRoomsInMaze, NumColumns, NumRows, SecondsForMazeSelection)
  1171.         For UserX = 0 To MaxX
  1172.           For UserY = 0 To MaxY
  1173.             If ComputerPage(UserY, UserX) = 0 Then
  1174.               UserPage(UserY, UserX) = 0
  1175.             Else
  1176.               UserPage(UserY, UserX) = 2
  1177.             End If
  1178.           Next UserY
  1179.         Next UserX
  1180.         UserX = 3
  1181.         UserXRelative = 1#
  1182.         UserY = 2
  1183.         UserYRelative = Sqrt3 / 2#
  1184.         UserPage(UserY, UserX) = 1
  1185.         Resize = False
  1186.       End If
  1187.       If (Paint) Then
  1188.         ScaleMode = 3
  1189.         Cls
  1190.         RadiansPerDegree = Atn(1#) / 45#
  1191.         Radians = Tilt * RadiansPerDegree
  1192.         SinTilt = Sin(Radians)
  1193.         CosTilt = Cos(Radians)
  1194.         TemDouble1 = NumColumns
  1195.         XMax = 3# * (TemDouble1 - 1#) / 2# + 2# + RelativeWidthOfWall / Sqrt3
  1196.         TemDouble1 = ScaleWidth - VScroll1.Width
  1197.         PixelsPerX = (TemDouble1 - 1#) / (XMax * (XMax / (XMax - RelativeHeightOfWall)))
  1198.         XOffset = (XMax / 2#) * (RelativeHeightOfWall / (XMax - RelativeHeightOfWall))
  1199.         TemDouble1 = NumRows
  1200.         YMax = TemDouble1 * Sqrt3 + RelativeWidthOfWall
  1201.         TemDouble1 = ScaleHeight - Text1.Height
  1202.         PixelsPerZ = (TemDouble1 - 1#) / Sqr(YMax * YMax + RelativeHeightOfWall * RelativeHeightOfWall)
  1203.         If YMax > XMax Then
  1204.           RelDistOfUserFromScreen = YMax
  1205.         Else
  1206.           RelDistOfUserFromScreen = XMax
  1207.         End If
  1208.         Paint = False
  1209.       End If
  1210.       If State = 0 Then
  1211.         State = 1
  1212.         DoEvents
  1213.         If State < 5 Then
  1214.           Timer1.Enabled = True
  1215.         End If
  1216.       End If
  1217.     Case 1
  1218.       BaseTriangle(0, 0).X = 0#
  1219.       BaseTriangle(0, 0).Y = RelativeWidthOfWall + Sqrt3 / 2#
  1220.       BaseTriangle(0, 1).X = 0#
  1221.       BaseTriangle(0, 1).Y = Sqrt3 / 2#
  1222.       BaseTriangle(0, 2).X = RelativeWidthOfWall * Sqrt3 / 2#
  1223.       BaseTriangle(0, 2).Y = (RelativeWidthOfWall + Sqrt3) / 2#
  1224.       BaseTriangle(1, 0).X = (1# - RelativeWidthOfWall / Sqrt3) / 2#
  1225.       BaseTriangle(1, 0).Y = RelativeWidthOfWall / 2#
  1226.       BaseTriangle(1, 1).X = 0.5 + RelativeWidthOfWall / Sqrt3
  1227.       BaseTriangle(1, 1).Y = 0#
  1228.       BaseTriangle(1, 2).X = BaseTriangle(1, 1).X
  1229.       BaseTriangle(1, 2).Y = RelativeWidthOfWall
  1230.       BaseTriangle(2, 0).X = 1.5
  1231.       BaseTriangle(2, 0).Y = RelativeWidthOfWall
  1232.       BaseTriangle(2, 1).X = 1.5
  1233.       BaseTriangle(2, 1).Y = 0#
  1234.       BaseTriangle(2, 2).X = 1.5 * (1# + RelativeWidthOfWall / Sqrt3)
  1235.       BaseTriangle(2, 2).Y = RelativeWidthOfWall / 2#
  1236.       BaseTriangle(3, 0).X = 2# - RelativeWidthOfWall / (2# * Sqrt3)
  1237.       BaseTriangle(3, 0).Y = BaseTriangle(0, 2).Y
  1238.       BaseTriangle(3, 1).X = 2# + RelativeWidthOfWall / Sqrt3
  1239.       BaseTriangle(3, 1).Y = BaseTriangle(0, 1).Y
  1240.       BaseTriangle(3, 2).X = BaseTriangle(3, 1).X
  1241.       BaseTriangle(3, 2).Y = BaseTriangle(0, 0).Y
  1242.       BaseRectangle(0, 0).X = BaseTriangle(0, 2).X
  1243.       BaseRectangle(0, 0).Y = BaseTriangle(0, 2).Y
  1244.       BaseRectangle(0, 1).X = BaseTriangle(1, 1).X
  1245.       BaseRectangle(0, 1).Y = Sqrt3
  1246.       BaseRectangle(0, 2).X = BaseTriangle(1, 0).X
  1247.       BaseRectangle(0, 2).Y = Sqrt3 + RelativeWidthOfWall / 2#
  1248.       BaseRectangle(0, 3).X = BaseTriangle(0, 0).X
  1249.       BaseRectangle(0, 3).Y = BaseTriangle(0, 0).Y
  1250.       BaseRectangle(1, 0).X = BaseTriangle(0, 1).X
  1251.       BaseRectangle(1, 0).Y = BaseTriangle(0, 1).Y
  1252.       BaseRectangle(1, 1).X = BaseTriangle(1, 0).X
  1253.       BaseRectangle(1, 1).Y = BaseTriangle(1, 0).Y
  1254.       BaseRectangle(1, 2).X = BaseTriangle(1, 2).X
  1255.       BaseRectangle(1, 2).Y = BaseTriangle(1, 2).Y
  1256.       BaseRectangle(1, 3).X = BaseTriangle(0, 2).X
  1257.       BaseRectangle(1, 3).Y = BaseTriangle(0, 2).Y
  1258.       BaseRectangle(2, 0).X = BaseTriangle(1, 1).X
  1259.       BaseRectangle(2, 0).Y = BaseTriangle(1, 1).Y
  1260.       BaseRectangle(2, 1).X = BaseTriangle(2, 1).X
  1261.       BaseRectangle(2, 1).Y = BaseTriangle(2, 1).Y
  1262.       BaseRectangle(2, 2).X = BaseTriangle(2, 0).X
  1263.       BaseRectangle(2, 2).Y = BaseTriangle(2, 0).Y
  1264.       BaseRectangle(2, 3).X = BaseTriangle(1, 2).X
  1265.       BaseRectangle(2, 3).Y = BaseTriangle(1, 2).Y
  1266.       BaseRectangle(3, 0).X = BaseTriangle(2, 2).X
  1267.       BaseRectangle(3, 0).Y = BaseTriangle(2, 2).Y
  1268.       BaseRectangle(3, 1).X = BaseTriangle(3, 1).X
  1269.       BaseRectangle(3, 1).Y = BaseTriangle(3, 1).Y
  1270.       BaseRectangle(3, 2).X = BaseTriangle(3, 0).X
  1271.       BaseRectangle(3, 2).Y = BaseTriangle(3, 0).Y
  1272.       BaseRectangle(3, 3).X = BaseTriangle(2, 0).X
  1273.       BaseRectangle(3, 3).Y = BaseTriangle(2, 0).Y
  1274.       BaseRectangle(4, 0).X = BaseTriangle(3, 1).X
  1275.       BaseRectangle(4, 0).Y = BaseTriangle(3, 1).Y
  1276.       BaseRectangle(4, 1).X = BaseTriangle(3, 1).X + (BaseTriangle(2, 1).X - BaseTriangle(1, 1).X)
  1277.       BaseRectangle(4, 1).Y = BaseTriangle(3, 1).Y
  1278.       BaseRectangle(4, 2).X = BaseRectangle(4, 1).X
  1279.       BaseRectangle(4, 2).Y = BaseTriangle(3, 2).Y
  1280.       BaseRectangle(4, 3).X = BaseTriangle(3, 2).X
  1281.       BaseRectangle(4, 3).Y = BaseTriangle(3, 2).Y
  1282.       BaseRectangle(5, 0).X = BaseRectangle(0, 1).X + (BaseTriangle(2, 1).X - BaseTriangle(1, 1).X)
  1283.       BaseRectangle(5, 0).Y = BaseRectangle(0, 1).Y
  1284.       BaseRectangle(5, 1).X = BaseTriangle(3, 0).X
  1285.       BaseRectangle(5, 1).Y = BaseTriangle(3, 0).Y
  1286.       BaseRectangle(5, 2).X = BaseTriangle(3, 2).X
  1287.       BaseRectangle(5, 2).Y = BaseTriangle(3, 2).Y
  1288.       BaseRectangle(5, 3).X = BaseRectangle(0, 2).X + (BaseTriangle(2, 2).X - BaseTriangle(1, 0).X)
  1289.       BaseRectangle(5, 3).Y = BaseRectangle(0, 2).Y
  1290.       Rectangle(0, 0).X = BaseTriangle(1, 1).X
  1291.       Rectangle(0, 0).Y = BaseTriangle(1, 1).Y
  1292.       Rectangle(0, 1).X = XMax - BaseTriangle(1, 1).X
  1293.       Rectangle(0, 1).Y = BaseTriangle(1, 1).Y
  1294.       Rectangle(0, 2).X = XMax - BaseTriangle(1, 2).X
  1295.       Rectangle(0, 2).Y = BaseTriangle(1, 2).Y
  1296.       Rectangle(0, 3).X = BaseTriangle(1, 2).X
  1297.       Rectangle(0, 3).Y = BaseTriangle(1, 2).Y
  1298.       Rectangle(1, 0).X = BaseTriangle(0, 1).X
  1299.       Rectangle(1, 0).Y = BaseTriangle(0, 1).Y
  1300.       Rectangle(1, 1).X = XMax - BaseTriangle(0, 1).X
  1301.       Rectangle(1, 1).Y = BaseTriangle(0, 1).Y
  1302.       Rectangle(1, 2).X = XMax - BaseTriangle(1, 2).X
  1303.       Rectangle(1, 2).Y = BaseTriangle(1, 2).Y
  1304.       Rectangle(1, 3).X = BaseTriangle(1, 2).X
  1305.       Rectangle(1, 3).Y = BaseTriangle(1, 2).Y
  1306.       Rectangle(2, 0).X = BaseTriangle(0, 1).X
  1307.       Rectangle(2, 0).Y = BaseTriangle(0, 1).Y
  1308.       Rectangle(2, 1).X = XMax - BaseTriangle(0, 1).X
  1309.       Rectangle(2, 1).Y = BaseTriangle(0, 1).Y
  1310.       Rectangle(2, 2).X = XMax - BaseTriangle(0, 0).X
  1311.       Rectangle(2, 2).Y = BaseTriangle(0, 0).Y
  1312.       Rectangle(2, 3).X = BaseTriangle(0, 0).X
  1313.       Rectangle(2, 3).Y = BaseTriangle(0, 0).Y
  1314.       Rectangle(3, 0).X = BaseTriangle(0, 0).X
  1315.       Rectangle(3, 0).Y = BaseTriangle(0, 0).Y
  1316.       Rectangle(3, 1).X = XMax - BaseTriangle(0, 0).X
  1317.       Rectangle(3, 1).Y = BaseTriangle(0, 0).Y
  1318.       Rectangle(3, 2).X = XMax - BaseRectangle(0, 1).X
  1319.       Rectangle(3, 2).Y = BaseRectangle(0, 1).Y
  1320.       Rectangle(3, 3).X = BaseRectangle(0, 1).X
  1321.       Rectangle(3, 3).Y = BaseRectangle(0, 1).Y
  1322.       Y = 0
  1323.       State = 2
  1324.       DoEvents
  1325.       If State < 5 Then
  1326.         Timer1.Enabled = True
  1327.       End If
  1328.     Case 2
  1329.       If UsePalette Then
  1330.         OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  1331.         NumRealized = RealizePalette(frm3DMaze.hDC)
  1332.       End If
  1333.       If (Y <= MaxY - 1) Then
  1334.         If Y > 0 Then
  1335.           X0 = Rectangle(0, 0).X
  1336.           Y0 = Rectangle(0, 0).Y
  1337.           X1 = Rectangle(0, 1).X
  1338.           Y1 = Rectangle(0, 1).Y
  1339.           X2 = Rectangle(0, 2).X
  1340.           Y2 = Rectangle(0, 2).Y
  1341.           X3 = Rectangle(0, 3).X
  1342.           Y3 = Rectangle(0, 3).Y
  1343.           Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  1344.           X0 = Rectangle(1, 0).X
  1345.           Y0 = Rectangle(1, 0).Y
  1346.           X1 = Rectangle(1, 1).X
  1347.           Y1 = Rectangle(1, 1).Y
  1348.           X2 = Rectangle(1, 2).X
  1349.           Y2 = Rectangle(1, 2).Y
  1350.           X3 = Rectangle(1, 3).X
  1351.           Y3 = Rectangle(1, 3).Y
  1352.           Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  1353.         End If
  1354.         X0 = Rectangle(2, 0).X
  1355.         Y0 = Rectangle(2, 0).Y
  1356.         X1 = Rectangle(2, 1).X
  1357.         Y1 = Rectangle(2, 1).Y
  1358.         X2 = Rectangle(2, 2).X
  1359.         Y2 = Rectangle(2, 2).Y
  1360.         X3 = Rectangle(2, 3).X
  1361.         Y3 = Rectangle(2, 3).Y
  1362.         Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  1363.         If Y < MaxY - 4 Then
  1364.           X0 = Rectangle(3, 0).X
  1365.           Y0 = Rectangle(3, 0).Y
  1366.           X1 = Rectangle(3, 1).X
  1367.           Y1 = Rectangle(3, 1).Y
  1368.           X2 = Rectangle(3, 2).X
  1369.           Y2 = Rectangle(3, 2).Y
  1370.           X3 = Rectangle(3, 3).X
  1371.           Y3 = Rectangle(3, 3).Y
  1372.           Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  1373.         End If
  1374.         For ObjectNum = 0 To 3
  1375.           For VertexNum = 0 To 3
  1376.             Rectangle(ObjectNum, VertexNum).Y = Rectangle(ObjectNum, VertexNum).Y + Sqrt3
  1377.           Next VertexNum
  1378.         Next ObjectNum
  1379.         Y = Y + 4
  1380.       Else
  1381.         Rectangle(0, 0).X = BaseTriangle(1, 0).X
  1382.         Rectangle(0, 0).Y = BaseTriangle(1, 0).Y
  1383.         Rectangle(0, 1).X = BaseTriangle(1, 1).X
  1384.         Rectangle(0, 1).Y = BaseTriangle(1, 1).Y
  1385.         Rectangle(0, 2).X = BaseTriangle(2, 1).X
  1386.         Rectangle(0, 2).Y = BaseTriangle(2, 1).Y
  1387.         Rectangle(0, 3).X = BaseTriangle(2, 2).X
  1388.         Rectangle(0, 3).Y = BaseTriangle(2, 2).Y
  1389.         Rectangle(1, 0).X = BaseTriangle(0, 1).X
  1390.         Rectangle(1, 0).Y = BaseTriangle(0, 1).Y
  1391.         Rectangle(1, 1).X = BaseTriangle(1, 0).X
  1392.         Rectangle(1, 1).Y = BaseTriangle(1, 0).Y
  1393.         Rectangle(1, 2).X = BaseTriangle(2, 2).X
  1394.         Rectangle(1, 2).Y = BaseTriangle(2, 2).Y
  1395.         Rectangle(1, 3).X = BaseTriangle(3, 1).X
  1396.         Rectangle(1, 3).Y = BaseTriangle(3, 1).Y
  1397.         Rectangle(2, 0).X = BaseTriangle(0, 0).X
  1398.         Rectangle(2, 0).Y = BaseTriangle(0, 0).Y
  1399.         Rectangle(2, 1).X = BaseTriangle(0, 1).X
  1400.         Rectangle(2, 1).Y = BaseTriangle(0, 1).Y
  1401.         Rectangle(2, 2).X = BaseTriangle(3, 1).X
  1402.         Rectangle(2, 2).Y = BaseTriangle(3, 1).Y
  1403.         Rectangle(2, 3).X = BaseTriangle(3, 2).X
  1404.         Rectangle(2, 3).Y = BaseTriangle(3, 2).Y
  1405.         X = 0
  1406.         State = 3
  1407.       End If
  1408.       If UsePalette Then
  1409.         NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  1410.       End If
  1411.       DoEvents
  1412.       If State < 5 Then
  1413.         Timer1.Enabled = True
  1414.       End If
  1415.     Case 3
  1416.       If UsePalette Then
  1417.         OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  1418.         NumRealized = RealizePalette(frm3DMaze.hDC)
  1419.       End If
  1420.       If X <= MaxX Then
  1421.         For ObjectNum = 0 To 2
  1422.           X0 = Rectangle(ObjectNum, 0).X
  1423.           Y0 = Rectangle(ObjectNum, 0).Y
  1424.           X1 = Rectangle(ObjectNum, 1).X
  1425.           Y1 = Rectangle(ObjectNum, 1).Y
  1426.           X2 = Rectangle(ObjectNum, 2).X
  1427.           Y2 = Rectangle(ObjectNum, 2).Y
  1428.           X3 = Rectangle(ObjectNum, 3).X
  1429.           Y3 = Rectangle(ObjectNum, 3).Y
  1430.           Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  1431.           X0 = Rectangle(ObjectNum, 0).X
  1432.           Y0 = YMax - Rectangle(ObjectNum, 0).Y
  1433.           X1 = Rectangle(ObjectNum, 1).X
  1434.           Y1 = YMax - Rectangle(ObjectNum, 1).Y
  1435.           X2 = Rectangle(ObjectNum, 2).X
  1436.           Y2 = YMax - Rectangle(ObjectNum, 2).Y
  1437.           X3 = Rectangle(ObjectNum, 3).X
  1438.           Y3 = YMax - Rectangle(ObjectNum, 3).Y
  1439.           Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  1440.           For VertexNum = 0 To 3
  1441.             Rectangle(ObjectNum, VertexNum).X = Rectangle(ObjectNum, VertexNum).X + 3#
  1442.           Next VertexNum
  1443.         Next ObjectNum
  1444.         X = X + 8
  1445.       Else
  1446.         YMod4 = 0
  1447.         YOffset = 0#
  1448.         Y = 0
  1449.         State = 4
  1450.       End If
  1451.       If UsePalette Then
  1452.         NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  1453.       End If
  1454.       DoEvents
  1455.       If State < 5 Then
  1456.         Timer1.Enabled = True
  1457.       End If
  1458.     Case 4
  1459.       If UsePalette Then
  1460.         OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  1461.         NumRealized = RealizePalette(frm3DMaze.hDC)
  1462.       End If
  1463.       If Y <= MaxY Then
  1464.         Select Case YMod4
  1465.           Case 0
  1466.             XMod8 = 0
  1467.             For ObjectNum = 1 To 2
  1468.               For VertexNum = 0 To 2
  1469.                 Triangle(ObjectNum, VertexNum).X = BaseTriangle(ObjectNum, VertexNum).X
  1470.                 Triangle(ObjectNum, VertexNum).Y = BaseTriangle(ObjectNum, VertexNum).Y + YOffset
  1471.               Next VertexNum
  1472.             Next ObjectNum
  1473.             For VertexNum = 0 To 3
  1474.               Rectangle(2, VertexNum).X = BaseRectangle(2, VertexNum).X
  1475.               Rectangle(2, VertexNum).Y = BaseRectangle(2, VertexNum).Y + YOffset
  1476.             Next VertexNum
  1477.             For X = 0 To MaxX
  1478.               Select Case XMod8
  1479.                 Case 2
  1480.                   SingleTriangle(0).X = Triangle(1, 0).X
  1481.                   SingleTriangle(0).Y = Triangle(1, 0).Y
  1482.                   SingleTriangle(1).X = Triangle(1, 1).X
  1483.                   SingleTriangle(1).Y = Triangle(1, 1).Y
  1484.                   SingleTriangle(2).X = Triangle(1, 2).X
  1485.                   SingleTriangle(2).Y = Triangle(1, 2).Y
  1486.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, True, TriangleSSWNNEColor)
  1487.                 Case 4
  1488.                   SingleTriangle(0).X = Triangle(2, 0).X
  1489.                   SingleTriangle(0).Y = Triangle(2, 0).Y
  1490.                   SingleTriangle(1).X = Triangle(2, 1).X
  1491.                   SingleTriangle(1).Y = Triangle(2, 1).Y
  1492.                   SingleTriangle(2).X = Triangle(2, 2).X
  1493.                   SingleTriangle(2).Y = Triangle(2, 2).Y
  1494.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, True, TriangleSSENNWColor)
  1495.                 Case Else
  1496.               End Select
  1497.               XMod8 = XMod8 + 1
  1498.               If XMod8 >= 8 Then
  1499.                 XMod8 = 0
  1500.                 For ObjectNum = 1 To 2
  1501.                   For VertexNum = 0 To 2
  1502.                     Triangle(ObjectNum, VertexNum).X = Triangle(ObjectNum, VertexNum).X + 3#
  1503.                   Next VertexNum
  1504.                 Next ObjectNum
  1505.                 For VertexNum = 0 To 3
  1506.                   Rectangle(2, VertexNum).X = Rectangle(2, VertexNum).X + 3#
  1507.                 Next VertexNum
  1508.               End If
  1509.             Next X
  1510.             XMod8 = 0
  1511.             For ObjectNum = 1 To 2
  1512.               For VertexNum = 0 To 2
  1513.                 Triangle(ObjectNum, VertexNum).X = BaseTriangle(ObjectNum, VertexNum).X
  1514.                 Triangle(ObjectNum, VertexNum).Y = BaseTriangle(ObjectNum, VertexNum).Y + YOffset
  1515.               Next VertexNum
  1516.             Next ObjectNum
  1517.             For VertexNum = 0 To 3
  1518.               Rectangle(2, VertexNum).X = BaseRectangle(2, VertexNum).X
  1519.               Rectangle(2, VertexNum).Y = BaseRectangle(2, VertexNum).Y + YOffset
  1520.             Next VertexNum
  1521.             For X = 0 To MaxX
  1522.               Select Case XMod8
  1523.                 Case 2
  1524.                   SingleTriangle(0).X = Triangle(1, 0).X
  1525.                   SingleTriangle(0).Y = Triangle(1, 0).Y
  1526.                   SingleTriangle(1).X = Triangle(1, 1).X
  1527.                   SingleTriangle(1).Y = Triangle(1, 1).Y
  1528.                   SingleTriangle(2).X = Triangle(1, 2).X
  1529.                   SingleTriangle(2).Y = Triangle(1, 2).Y
  1530.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, False, TriangleSENWColor)
  1531.                 Case 3
  1532.                   If ComputerPage(Y, X) = 0 Then
  1533.                     SingleRectangle(0).X = Rectangle(2, 0).X
  1534.                     SingleRectangle(0).Y = Rectangle(2, 0).Y
  1535.                     SingleRectangle(1).X = Rectangle(2, 1).X
  1536.                     SingleRectangle(1).Y = Rectangle(2, 1).Y
  1537.                     SingleRectangle(2).X = Rectangle(2, 2).X
  1538.                     SingleRectangle(2).Y = Rectangle(2, 2).Y
  1539.                     SingleRectangle(3).X = Rectangle(2, 3).X
  1540.                     SingleRectangle(3).Y = Rectangle(2, 3).Y
  1541.                     Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleWEColor)
  1542.                   End If
  1543.                 Case 4
  1544.                   SingleTriangle(0).X = Triangle(2, 0).X
  1545.                   SingleTriangle(0).Y = Triangle(2, 0).Y
  1546.                   SingleTriangle(1).X = Triangle(2, 1).X
  1547.                   SingleTriangle(1).Y = Triangle(2, 1).Y
  1548.                   SingleTriangle(2).X = Triangle(2, 2).X
  1549.                   SingleTriangle(2).Y = Triangle(2, 2).Y
  1550.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, False, TriangleSWNEColor)
  1551.                 Case Else
  1552.               End Select
  1553.               XMod8 = XMod8 + 1
  1554.               If XMod8 >= 8 Then
  1555.                 XMod8 = 0
  1556.                 For ObjectNum = 1 To 2
  1557.                   For VertexNum = 0 To 2
  1558.                     Triangle(ObjectNum, VertexNum).X = Triangle(ObjectNum, VertexNum).X + 3#
  1559.                   Next VertexNum
  1560.                 Next ObjectNum
  1561.                 For VertexNum = 0 To 3
  1562.                   Rectangle(2, VertexNum).X = Rectangle(2, VertexNum).X + 3#
  1563.                 Next VertexNum
  1564.               End If
  1565.             Next X
  1566.           Case 1
  1567.             XMod8 = 0
  1568.             For ObjectNum = 1 To 3 Step 2
  1569.               For VertexNum = 0 To 3
  1570.                 Rectangle(ObjectNum, VertexNum).X = BaseRectangle(ObjectNum, VertexNum).X
  1571.                 Rectangle(ObjectNum, VertexNum).Y = BaseRectangle(ObjectNum, VertexNum).Y + YOffset
  1572.               Next VertexNum
  1573.             Next ObjectNum
  1574.             For X = 0 To MaxX
  1575.               Select Case XMod8
  1576.                 Case 1
  1577.                   If ComputerPage(Y, X) = 0 Then
  1578.                     SingleRectangle(0).X = Rectangle(1, 0).X
  1579.                     SingleRectangle(0).Y = Rectangle(1, 0).Y
  1580.                     SingleRectangle(1).X = Rectangle(1, 1).X
  1581.                     SingleRectangle(1).Y = Rectangle(1, 1).Y
  1582.                     SingleRectangle(2).X = Rectangle(1, 2).X
  1583.                     SingleRectangle(2).Y = Rectangle(1, 2).Y
  1584.                     SingleRectangle(3).X = Rectangle(1, 3).X
  1585.                     SingleRectangle(3).Y = Rectangle(1, 3).Y
  1586.                     Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSWNEColor)
  1587.                   End If
  1588.                 Case 5
  1589.                   If ComputerPage(Y, X) = 0 Then
  1590.                     SingleRectangle(0).X = Rectangle(3, 0).X
  1591.                     SingleRectangle(0).Y = Rectangle(3, 0).Y
  1592.                     SingleRectangle(1).X = Rectangle(3, 1).X
  1593.                     SingleRectangle(1).Y = Rectangle(3, 1).Y
  1594.                     SingleRectangle(2).X = Rectangle(3, 2).X
  1595.                     SingleRectangle(2).Y = Rectangle(3, 2).Y
  1596.                     SingleRectangle(3).X = Rectangle(3, 3).X
  1597.                     SingleRectangle(3).Y = Rectangle(3, 3).Y
  1598.                     Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSENWColor)
  1599.                   End If
  1600.                 Case Else
  1601.               End Select
  1602.               XMod8 = XMod8 + 1
  1603.               If XMod8 >= 8 Then
  1604.                 XMod8 = 0
  1605.                 For ObjectNum = 1 To 3 Step 2
  1606.                   For VertexNum = 0 To 3
  1607.                     Rectangle(ObjectNum, VertexNum).X = Rectangle(ObjectNum, VertexNum).X + 3#
  1608.                   Next VertexNum
  1609.                 Next ObjectNum
  1610.               End If
  1611.             Next X
  1612.           Case 2
  1613.             XMod8 = 0
  1614.             For ObjectNum = 0 To 3 Step 3
  1615.               For VertexNum = 0 To 2
  1616.                 Triangle(ObjectNum, VertexNum).X = BaseTriangle(ObjectNum, VertexNum).X
  1617.                 Triangle(ObjectNum, VertexNum).Y = BaseTriangle(ObjectNum, VertexNum).Y + YOffset
  1618.               Next VertexNum
  1619.             Next ObjectNum
  1620.             For VertexNum = 0 To 3
  1621.               Rectangle(4, VertexNum).X = BaseRectangle(4, VertexNum).X
  1622.               Rectangle(4, VertexNum).Y = BaseRectangle(4, VertexNum).Y + YOffset
  1623.             Next VertexNum
  1624.             For X = 0 To MaxX
  1625.               Select Case XMod8
  1626.                 Case 0
  1627.                   SingleTriangle(0).X = Triangle(0, 0).X
  1628.                   SingleTriangle(0).Y = Triangle(0, 0).Y
  1629.                   SingleTriangle(1).X = Triangle(0, 1).X
  1630.                   SingleTriangle(1).Y = Triangle(0, 1).Y
  1631.                   SingleTriangle(2).X = Triangle(0, 2).X
  1632.                   SingleTriangle(2).Y = Triangle(0, 2).Y
  1633.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, True, TriangleSSWNNEColor)
  1634.                 Case 6
  1635.                   SingleTriangle(0).X = Triangle(3, 0).X
  1636.                   SingleTriangle(0).Y = Triangle(3, 0).Y
  1637.                   SingleTriangle(1).X = Triangle(3, 1).X
  1638.                   SingleTriangle(1).Y = Triangle(3, 1).Y
  1639.                   SingleTriangle(2).X = Triangle(3, 2).X
  1640.                   SingleTriangle(2).Y = Triangle(3, 2).Y
  1641.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, True, TriangleSSENNWColor)
  1642.                 Case Else
  1643.               End Select
  1644.               XMod8 = XMod8 + 1
  1645.               If XMod8 >= 8 Then
  1646.                 XMod8 = 0
  1647.                 For ObjectNum = 0 To 3 Step 3
  1648.                   For VertexNum = 0 To 2
  1649.                     Triangle(ObjectNum, VertexNum).X = Triangle(ObjectNum, VertexNum).X + 3#
  1650.                   Next VertexNum
  1651.                 Next ObjectNum
  1652.                 For VertexNum = 0 To 3
  1653.                   Rectangle(4, VertexNum).X = Rectangle(4, VertexNum).X + 3#
  1654.                 Next VertexNum
  1655.               End If
  1656.             Next X
  1657.             XMod8 = 0
  1658.             For ObjectNum = 0 To 3 Step 3
  1659.               For VertexNum = 0 To 2
  1660.                 Triangle(ObjectNum, VertexNum).X = BaseTriangle(ObjectNum, VertexNum).X
  1661.                 Triangle(ObjectNum, VertexNum).Y = BaseTriangle(ObjectNum, VertexNum).Y + YOffset
  1662.               Next VertexNum
  1663.             Next ObjectNum
  1664.             For VertexNum = 0 To 3
  1665.               Rectangle(4, VertexNum).X = BaseRectangle(4, VertexNum).X
  1666.               Rectangle(4, VertexNum).Y = BaseRectangle(4, VertexNum).Y + YOffset
  1667.             Next VertexNum
  1668.             For X = 0 To MaxX
  1669.               Select Case XMod8
  1670.                 Case 0
  1671.                   SingleTriangle(0).X = Triangle(0, 0).X
  1672.                   SingleTriangle(0).Y = Triangle(0, 0).Y
  1673.                   SingleTriangle(1).X = Triangle(0, 1).X
  1674.                   SingleTriangle(1).Y = Triangle(0, 1).Y
  1675.                   SingleTriangle(2).X = Triangle(0, 2).X
  1676.                   SingleTriangle(2).Y = Triangle(0, 2).Y
  1677.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, False, TriangleSWNEColor)
  1678.                 Case 6
  1679.                   SingleTriangle(0).X = Triangle(3, 0).X
  1680.                   SingleTriangle(0).Y = Triangle(3, 0).Y
  1681.                   SingleTriangle(1).X = Triangle(3, 1).X
  1682.                   SingleTriangle(1).Y = Triangle(3, 1).Y
  1683.                   SingleTriangle(2).X = Triangle(3, 2).X
  1684.                   SingleTriangle(2).Y = Triangle(3, 2).Y
  1685.                   Call OutputTriangle(XMax, XOffset, YMax, SingleTriangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, False, TriangleSENWColor)
  1686.                 Case 7
  1687.                   If ComputerPage(Y, X) = 0 Then
  1688.                     SingleRectangle(0).X = Rectangle(4, 0).X
  1689.                     SingleRectangle(0).Y = Rectangle(4, 0).Y
  1690.                     SingleRectangle(1).X = Rectangle(4, 1).X
  1691.                     SingleRectangle(1).Y = Rectangle(4, 1).Y
  1692.                     SingleRectangle(2).X = Rectangle(4, 2).X
  1693.                     SingleRectangle(2).Y = Rectangle(4, 2).Y
  1694.                     SingleRectangle(3).X = Rectangle(4, 3).X
  1695.                     SingleRectangle(3).Y = Rectangle(4, 3).Y
  1696.                     Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleWEColor)
  1697.                   End If
  1698.                 Case Else
  1699.               End Select
  1700.               XMod8 = XMod8 + 1
  1701.               If XMod8 >= 8 Then
  1702.                 XMod8 = 0
  1703.                 For ObjectNum = 0 To 3 Step 3
  1704.                   For VertexNum = 0 To 2
  1705.                     Triangle(ObjectNum, VertexNum).X = Triangle(ObjectNum, VertexNum).X + 3#
  1706.                   Next VertexNum
  1707.                 Next ObjectNum
  1708.                 For VertexNum = 0 To 3
  1709.                   Rectangle(4, VertexNum).X = Rectangle(4, VertexNum).X + 3#
  1710.                 Next VertexNum
  1711.               End If
  1712.             Next X
  1713.           Case Else
  1714.             XMod8 = 0
  1715.             For ObjectNum = 0 To 5 Step 5
  1716.               For VertexNum = 0 To 3
  1717.                 Rectangle(ObjectNum, VertexNum).X = BaseRectangle(ObjectNum, VertexNum).X
  1718.                 Rectangle(ObjectNum, VertexNum).Y = BaseRectangle(ObjectNum, VertexNum).Y + YOffset
  1719.               Next VertexNum
  1720.             Next ObjectNum
  1721.             For X = 0 To MaxX
  1722.               Select Case XMod8
  1723.                 Case 1
  1724.                   If ComputerPage(Y, X) = 0 Then
  1725.                     SingleRectangle(0).X = Rectangle(0, 0).X
  1726.                     SingleRectangle(0).Y = Rectangle(0, 0).Y
  1727.                     SingleRectangle(1).X = Rectangle(0, 1).X
  1728.                     SingleRectangle(1).Y = Rectangle(0, 1).Y
  1729.                     SingleRectangle(2).X = Rectangle(0, 2).X
  1730.                     SingleRectangle(2).Y = Rectangle(0, 2).Y
  1731.                     SingleRectangle(3).X = Rectangle(0, 3).X
  1732.                     SingleRectangle(3).Y = Rectangle(0, 3).Y
  1733.                     Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSENWColor)
  1734.                   End If
  1735.                 Case 5
  1736.                   If ComputerPage(Y, X) = 0 Then
  1737.                     SingleRectangle(0).X = Rectangle(5, 0).X
  1738.                     SingleRectangle(0).Y = Rectangle(5, 0).Y
  1739.                     SingleRectangle(1).X = Rectangle(5, 1).X
  1740.                     SingleRectangle(1).Y = Rectangle(5, 1).Y
  1741.                     SingleRectangle(2).X = Rectangle(5, 2).X
  1742.                     SingleRectangle(2).Y = Rectangle(5, 2).Y
  1743.                     SingleRectangle(3).X = Rectangle(5, 3).X
  1744.                     SingleRectangle(3).Y = Rectangle(5, 3).Y
  1745.                     Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleSWNEColor)
  1746.                   End If
  1747.                 Case Else
  1748.               End Select
  1749.               XMod8 = XMod8 + 1
  1750.               If XMod8 >= 8 Then
  1751.                 XMod8 = 0
  1752.                 For ObjectNum = 0 To 5 Step 5
  1753.                   For VertexNum = 0 To 3
  1754.                     Rectangle(ObjectNum, VertexNum).X = Rectangle(ObjectNum, VertexNum).X + 3#
  1755.                   Next VertexNum
  1756.                 Next ObjectNum
  1757.               End If
  1758.             Next X
  1759.         End Select
  1760.         YMod4 = YMod4 + 1
  1761.         If YMod4 >= 4 Then
  1762.           YMod4 = 0
  1763.           YOffset = YOffset + Sqrt3
  1764.         End If
  1765.         Y = Y + 1
  1766.       Else
  1767.         State = 5
  1768.       End If
  1769.       If UsePalette Then
  1770.         NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  1771.       End If
  1772.       DoEvents
  1773.       If State < 5 Then
  1774.         Timer1.Enabled = True
  1775.       Else
  1776.         If State = 5 Then
  1777.           AlreadyPainting = False
  1778.           Call HexDisplayUserMoves(MaxX, MaxY, UserPage, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1779.           If SolutionDisplayed Then
  1780.             Call HexDisplaySolution(MaxY, ComputerPage, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1781.             Text1.Text = ""
  1782.           Else
  1783.             If UserHasSolved Then
  1784.               Text1.Text = "Congratulations!"
  1785.             Else
  1786.               Text1.Text = "Use Home, Up Arrow, PgUp, End, Down Arrow, and PgDn to solve."
  1787.             End If
  1788.           End If
  1789.           mnuActionItem(1).Enabled = True
  1790.           mnuActionItem(2).Enabled = True
  1791.         End If
  1792.       End If
  1793.     Case Else
  1794.       DoEvents
  1795.   End Select
  1796. End Sub
  1797. Private Sub SqrDisplaySolution(MaxY As Integer, Page() As Byte, XMax As Double, XOffset As Double, YMax As Double, CosTilt As Double, SinTilt As Double, PixelsPerX As Double, PixelsPerZ As Double, RelDistOfUserFromScreen As Double)
  1798.   Dim DeltaIndex As Byte
  1799.   Dim OldPaletteHandle As Long
  1800.   Dim PathFound As Integer
  1801.   Dim TemDouble As Double
  1802.   Dim X As Integer
  1803.   Dim XNext As Integer
  1804.   Dim XPrevious As Integer
  1805.   Dim XRelative As Double
  1806.   Dim XRelativeNext As Double
  1807.   Dim Y As Integer
  1808.   Dim YNext As Integer
  1809.   Dim YPrevious As Integer
  1810.   Dim YRelative As Double
  1811.   Dim YRelativeNext As Double
  1812.   If UsePalette Then
  1813.     OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  1814.     NumRealized = RealizePalette(frm3DMaze.hDC)
  1815.   End If
  1816.   XRelative = (RelativeWidthOfWall + 1#) / 2#
  1817.   YRelative = (RelativeWidthOfWall + 1#) / 2#
  1818.   CurrentColor = SolutionColor
  1819.   Call DrawLine(XRelative, RelativeWidthOfWall / 2#, XRelative, YRelative, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1820.   XPrevious = 1
  1821.   YPrevious = -1
  1822.   X = 1
  1823.   Y = 1
  1824.     PathFound = False
  1825.     DeltaIndex = 0
  1826.     Do While (Not PathFound)
  1827.       XNext = X + SqrDeltaX(DeltaIndex, 0)
  1828.       YNext = Y + SqrDeltaY(DeltaIndex, 0)
  1829.       If Page(YNext, XNext) = 1 Then
  1830.         XNext = XNext + SqrDeltaX(DeltaIndex, 0)
  1831.         YNext = YNext + SqrDeltaY(DeltaIndex, 0)
  1832.         If (XNext <> XPrevious) Or (YNext <> YPrevious) Then
  1833.           PathFound = True
  1834.         Else
  1835.           DeltaIndex = DeltaIndex + 1
  1836.         End If
  1837.       Else
  1838.         DeltaIndex = DeltaIndex + 1
  1839.       End If
  1840.     Loop
  1841.     If YNext < MaxY Then
  1842.       TemDouble = SqrDeltaX(DeltaIndex, 0)
  1843.       XRelativeNext = XRelative + TemDouble
  1844.       TemDouble = SqrDeltaY(DeltaIndex, 0)
  1845.       YRelativeNext = YRelative + TemDouble
  1846.       Call DrawLine(XRelative, YRelative, XRelativeNext, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1847.     Else
  1848.       Call DrawLine(XRelative, YRelative, XRelative, YMax, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1849.     End If
  1850.     XPrevious = X
  1851.     YPrevious = Y
  1852.     X = XNext
  1853.     Y = YNext
  1854.     XRelative = XRelativeNext
  1855.     YRelative = YRelativeNext
  1856.   Loop While YNext < MaxY
  1857.   If UsePalette Then
  1858.     NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  1859.   End If
  1860. End Sub
  1861. Private Sub SqrDisplayUserMoves(MaxX As Integer, MaxY As Integer, Page() As Byte, XMax As Double, XOffset As Double, YMax As Double, CosTilt As Double, SinTilt As Double, PixelsPerX As Double, PixelsPerZ As Double, RelDistOfUserFromScreen As Double)
  1862.   Dim DeltaIndex As Byte
  1863.   Dim OldPaletteHandle As Long
  1864.   Dim TemDouble As Double
  1865.   Dim X As Integer
  1866.   Dim XNext As Integer
  1867.   Dim XNextNext As Integer
  1868.   Dim XRelative As Double
  1869.   Dim XRelativeNext As Double
  1870.   Dim Y As Integer
  1871.   Dim YNext As Integer
  1872.   Dim YNextNext As Integer
  1873.   Dim YRelative As Double
  1874.   Dim YRelativeNext As Double
  1875.   If UsePalette Then
  1876.     OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  1877.     NumRealized = RealizePalette(frm3DMaze.hDC)
  1878.   End If
  1879.   Y = 1
  1880.   YRelative = (RelativeWidthOfWall + 1#) / 2#
  1881.   Do While (Y < MaxY)
  1882.     X = 1
  1883.     XRelative = (RelativeWidthOfWall + 1#) / 2#
  1884.     Do While (X < MaxX)
  1885.       If ((Page(Y, X) = 1) Or (Page(Y, X) = 3)) Then
  1886.         For DeltaIndex = 0 To 3
  1887.           XNext = X + SqrDeltaX(DeltaIndex, 0)
  1888.           YNext = Y + SqrDeltaY(DeltaIndex, 0)
  1889.           If Page(YNext, XNext) <> 0 Then
  1890.             If YNext = 0 Then
  1891.               CurrentColor = AdvanceColor
  1892.               Call DrawLine(XRelative, RelativeWidthOfWall / 2#, XRelative, YRelative, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1893.             Else
  1894.               If YNext = MaxY Then
  1895.                 If UserHasSolved Then
  1896.                   CurrentColor = AdvanceColor
  1897.                   Call DrawLine(XRelative, YRelative, XRelative, YMax, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1898.                 End If
  1899.               Else
  1900.                 XNextNext = XNext + SqrDeltaX(DeltaIndex, 0)
  1901.                 If XNextNext > 0 Then
  1902.                   If XNextNext < MaxX Then
  1903.                     YNextNext = YNext + SqrDeltaY(DeltaIndex, 0)
  1904.                     If YNextNext > 0 Then
  1905.                       If YNextNext < MaxY Then
  1906.                         If ((Page(YNextNext, XNextNext) = 1) Or (Page(YNextNext, XNextNext) = 3)) Then
  1907.                           If Page(Y, X) = Page(YNextNext, XNextNext) Then
  1908.                             If Page(Y, X) = 1 Then
  1909.                               CurrentColor = AdvanceColor
  1910.                             Else
  1911.                               CurrentColor = BackoutColor
  1912.                             End If
  1913.                           Else
  1914.                             CurrentColor = BackoutColor
  1915.                           End If
  1916.                           TemDouble = SqrDeltaX(DeltaIndex, 0)
  1917.                           XRelativeNext = XRelative + TemDouble / 2#
  1918.                           TemDouble = SqrDeltaY(DeltaIndex, 0)
  1919.                           YRelativeNext = YRelative + TemDouble / 2#
  1920.                           Call DrawLine(XRelative, YRelative, XRelativeNext, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  1921.                         End If
  1922.                        End If
  1923.                     End If
  1924.                   End If
  1925.                 End If
  1926.               End If
  1927.             End If
  1928.           End If
  1929.         Next DeltaIndex
  1930.       End If
  1931.       XRelative = XRelative + 1#
  1932.       X = X + 2
  1933.     Loop
  1934.     YRelative = YRelative + 1#
  1935.     Y = Y + 2
  1936.   Loop
  1937.   If UsePalette Then
  1938.     NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  1939.   End If
  1940. End Sub
  1941. Private Sub SqrSolveMaze(Stack() As StackRec, Page() As Byte, NumRoomsInSolution As Integer, Adjacency As Integer, MaxX As Integer, MaxY As Integer)
  1942.   Dim DeltaIndex As Byte
  1943.   Dim PassageFound As Integer
  1944.   Dim StackHead As Integer
  1945.   Dim X As Integer
  1946.   Dim XNext As Integer
  1947.   Dim Y As Integer
  1948.   Dim YNext As Integer
  1949.   NumRoomsInSolution = 1
  1950.   Adjacency = 0
  1951.   X = 1
  1952.   Y = 1
  1953.   StackHead = -1
  1954.   Page(Y, X) = 1
  1955.     DeltaIndex = 0
  1956.     PassageFound = False
  1957.     Do
  1958.       Do While ((DeltaIndex < 4) And (Not PassageFound))
  1959.         XNext = X + SqrDeltaX(DeltaIndex, 0)
  1960.         YNext = Y + SqrDeltaY(DeltaIndex, 0)
  1961.         If Page(YNext, XNext) = 2 Then
  1962.           PassageFound = True
  1963.         Else
  1964.           DeltaIndex = DeltaIndex + 1
  1965.         End If
  1966.       Loop
  1967.       If Not PassageFound Then
  1968.         DeltaIndex = Stack(StackHead).Index1
  1969.         Page(Y, X) = 2
  1970.         X = X - SqrDeltaX(DeltaIndex, 0)
  1971.         Y = Y - SqrDeltaY(DeltaIndex, 0)
  1972.         Page(Y, X) = 2
  1973.         X = X - SqrDeltaX(DeltaIndex, 0)
  1974.         Y = Y - SqrDeltaY(DeltaIndex, 0)
  1975.         StackHead = StackHead - 1
  1976.         DeltaIndex = DeltaIndex + 1
  1977.       End If
  1978.     Loop While Not PassageFound
  1979.     Page(YNext, XNext) = 1
  1980.     XNext = XNext + SqrDeltaX(DeltaIndex, 0)
  1981.     YNext = YNext + SqrDeltaY(DeltaIndex, 0)
  1982.     If YNext <= MaxY Then
  1983.       StackHead = StackHead + 1
  1984.       Stack(StackHead).Index1 = DeltaIndex
  1985.       Page(YNext, XNext) = 1
  1986.       X = XNext
  1987.       Y = YNext
  1988.     End If
  1989.   Loop While YNext < MaxY
  1990.   X = MaxX - 1
  1991.   Y = MaxY - 1
  1992.   Adjacency = 0
  1993.   Do While (StackHead >= 0)
  1994.     For DeltaIndex = 0 To 3
  1995.       XNext = X + SqrDeltaX(DeltaIndex, 0)
  1996.       YNext = Y + SqrDeltaY(DeltaIndex, 0)
  1997.       If Page(YNext, XNext) <> 1 Then
  1998.         If Page(YNext, XNext) = 0 Then
  1999.           XNext = XNext + SqrDeltaX(DeltaIndex, 0)
  2000.           YNext = YNext + SqrDeltaY(DeltaIndex, 0)
  2001.           If XNext < 0 Then
  2002.             Adjacency = Adjacency + 1
  2003.           Else
  2004.             If XNext > MaxX Then
  2005.               Adjacency = Adjacency + 1
  2006.             Else
  2007.               If YNext < 0 Then
  2008.                 Adjacency = Adjacency + 1
  2009.               Else
  2010.                 If YNext > MaxY Then
  2011.                   Adjacency = Adjacency + 1
  2012.                 Else
  2013.                   If Page(YNext, XNext) = 1 Then
  2014.                     Adjacency = Adjacency + 1
  2015.                   End If
  2016.                 End If
  2017.               End If
  2018.             End If
  2019.           End If
  2020.         End If
  2021.       End If
  2022.     Next DeltaIndex
  2023.     X = X - 2 * SqrDeltaX(Stack(StackHead).Index1, 0)
  2024.     Y = Y - 2 * SqrDeltaY(Stack(StackHead).Index1, 0)
  2025.     StackHead = StackHead - 1
  2026.     NumRoomsInSolution = NumRoomsInSolution + 1
  2027.   Loop
  2028.   For DeltaIndex = 0 To 3
  2029.     XNext = X + SqrDeltaX(DeltaIndex, 0)
  2030.     YNext = X + SqrDeltaY(DeltaIndex, 0)
  2031.     If Page(YNext, XNext) <> 2 Then
  2032.       If Page(YNext, XNext) = 0 Then
  2033.         XNext = XNext + SqrDeltaX(DeltaIndex, 0)
  2034.         YNext = YNext + SqrDeltaY(DeltaIndex, 0)
  2035.         If XNext < 0 Then
  2036.           Adjacency = Adjacency + 1
  2037.         Else
  2038.           If XNext > MaxX Then
  2039.             Adjacency = Adjacency + 1
  2040.           Else
  2041.             If YNext < 0 Then
  2042.               Adjacency = Adjacency + 1
  2043.             Else
  2044.               If YNext > MaxY Then
  2045.                 Adjacency = Adjacency + 1
  2046.               Else
  2047.                 If Page(YNext, XNext) = 1 Then
  2048.                   Adjacency = Adjacency + 1
  2049.                 End If
  2050.               End If
  2051.             End If
  2052.           End If
  2053.         End If
  2054.       End If
  2055.     End If
  2056.   Next DeltaIndex
  2057. End Sub
  2058. Private Sub SqrGenerateMaze(Page() As Byte, MaxX As Integer, MaxY As Integer, Stack() As StackRec, NumColumns As Integer, NumRows As Integer, Seed() As Byte)
  2059.   Dim DeltaIndex1 As Byte
  2060.   Dim DeltaIndex2 As Integer
  2061.   Dim Digit As Integer
  2062.   Dim DigitNum As Byte
  2063.   Dim PassageFound As Integer
  2064.   Dim RN(7) As Integer
  2065.   Dim RNIndex1 As Integer
  2066.   Dim RNIndex2 As Integer
  2067.   Dim SearchComplete As Integer
  2068.   Dim StackHead As Integer
  2069.   Dim Sum As Integer
  2070.   Dim TemInt As Integer
  2071.   Dim X As Integer
  2072.   Dim XNext As Integer
  2073.   Dim Y As Integer
  2074.   Dim YNext As Integer
  2075.   RN(0) = Seed(0) + 1
  2076.   RN(1) = Seed(1) + 1
  2077.   RN(2) = Seed(2) + 1
  2078.   RN(3) = Seed(3) + 1
  2079.   RN(4) = Seed(4) + 1
  2080.   RN(5) = Seed(5) + 1
  2081.   RN(6) = Seed(6) + 1
  2082.   RN(7) = Seed(7) + 1
  2083.   For Y = 0 To MaxY
  2084.     For X = 0 To MaxX
  2085.       Page(Y, X) = 0
  2086.     Next X
  2087.   Next Y
  2088.   Sum = 0
  2089.   For DigitNum = 1 To 3
  2090.     Digit = RN(0)
  2091.     RNIndex1 = 0
  2092.     RNIndex2 = 1
  2093.     Do While (RNIndex2 < 8)
  2094.       TemInt = RN(RNIndex2)
  2095.       RN(RNIndex1) = TemInt
  2096.       Digit = Digit + TemInt
  2097.       If Digit >= 29 Then Digit = Digit - 29
  2098.       RNIndex1 = RNIndex2
  2099.       RNIndex2 = RNIndex2 + 1
  2100.     Loop
  2101.     RN(7) = Digit
  2102.     Sum = 29 * Sum + Digit
  2103.   Next DigitNum
  2104.   X = 2 * (Sum Mod NumColumns) + 1
  2105.   Sum = 0
  2106.   For DigitNum = 1 To 3
  2107.     Digit = RN(0)
  2108.     RNIndex1 = 0
  2109.     RNIndex2 = 1
  2110.     Do While (RNIndex2 < 8)
  2111.       TemInt = RN(RNIndex2)
  2112.       RN(RNIndex1) = TemInt
  2113.       Digit = Digit + TemInt
  2114.       If Digit >= 29 Then Digit = Digit - 29
  2115.       RNIndex1 = RNIndex2
  2116.       RNIndex2 = RNIndex2 + 1
  2117.     Loop
  2118.     RN(7) = Digit
  2119.     Sum = 29 * Sum + Digit
  2120.   Next DigitNum
  2121.   Y = 2 * (Sum Mod NumRows) + 1
  2122.   Page(Y, X) = 2
  2123.   StackHead = -1
  2124.     DeltaIndex1 = 0
  2125.     Do
  2126.       DeltaIndex2 = RN(0)
  2127.       RNIndex1 = 0
  2128.       RNIndex2 = 1
  2129.       Do While (RNIndex2 < 8)
  2130.         TemInt = RN(RNIndex2)
  2131.         RN(RNIndex1) = TemInt
  2132.         DeltaIndex2 = DeltaIndex2 + TemInt
  2133.         If DeltaIndex2 >= 29 Then DeltaIndex2 = DeltaIndex2 - 29
  2134.         RNIndex1 = RNIndex2
  2135.         RNIndex2 = RNIndex2 + 1
  2136.       Loop
  2137.       RN(7) = DeltaIndex2
  2138.     Loop While DeltaIndex2 >= 24
  2139.     PassageFound = False
  2140.     SearchComplete = False
  2141.     Do While (Not SearchComplete)
  2142.       Do While ((DeltaIndex1 < 4) And (Not PassageFound))
  2143.         XNext = X + 2 * SqrDeltaX(DeltaIndex1, DeltaIndex2)
  2144.         If XNext <= 0 Then
  2145.           DeltaIndex1 = DeltaIndex1 + 1
  2146.         Else
  2147.           If XNext > MaxX Then
  2148.             DeltaIndex1 = DeltaIndex1 + 1
  2149.           Else
  2150.             YNext = Y + 2 * SqrDeltaY(DeltaIndex1, DeltaIndex2)
  2151.             If YNext <= 0 Then
  2152.               DeltaIndex1 = DeltaIndex1 + 1
  2153.             Else
  2154.               If YNext > MaxY Then
  2155.                 DeltaIndex1 = DeltaIndex1 + 1
  2156.               Else
  2157.                 If Page(YNext, XNext) = 0 Then
  2158.                   PassageFound = True
  2159.                 Else
  2160.                   DeltaIndex1 = DeltaIndex1 + 1
  2161.                 End If
  2162.               End If
  2163.             End If
  2164.           End If
  2165.         End If
  2166.       Loop
  2167.       If Not PassageFound Then
  2168.         If StackHead >= 0 Then
  2169.           DeltaIndex1 = Stack(StackHead).Index1
  2170.           DeltaIndex2 = Stack(StackHead).Index2
  2171.           X = X - 2 * SqrDeltaX(DeltaIndex1, DeltaIndex2)
  2172.           Y = Y - 2 * SqrDeltaY(DeltaIndex1, DeltaIndex2)
  2173.           StackHead = StackHead - 1
  2174.           DeltaIndex1 = DeltaIndex1 + 1
  2175.         End If
  2176.       End If
  2177.       If ((PassageFound) Or ((StackHead = -1) And (DeltaIndex1 >= 4))) Then
  2178.         SearchComplete = True
  2179.       Else
  2180.         SearchComplete = False
  2181.       End If
  2182.     Loop
  2183.     If PassageFound Then
  2184.       StackHead = StackHead + 1
  2185.       Stack(StackHead).Index1 = DeltaIndex1
  2186.       Stack(StackHead).Index2 = DeltaIndex2
  2187.       Page(YNext, XNext) = 2
  2188.       Page((Y + YNext) \ 2, (X + XNext) \ 2) = 2
  2189.       X = XNext
  2190.       Y = YNext
  2191.     End If
  2192.   Loop While StackHead <> -1
  2193.   Page(0, 1) = 1
  2194.   Page(MaxY, MaxX - 1) = 2
  2195. End Sub
  2196. Private Sub SqrSelectMaze(Seed As String, Page() As Byte, MaxX As Integer, MaxY As Integer, Stack() As StackRec, NumRoomsInMaze As Integer, NumColumns As Integer, NumRows As Integer, SecondsForMazeSelection As Double)
  2197.   Dim Adjacency As Integer
  2198.   Dim Counter0 As Byte
  2199.   Dim Counter1 As Byte
  2200.   Dim Counter2 As Byte
  2201.   Dim Counter3 As Byte
  2202.   Dim Counter4 As Byte
  2203.   Dim Counter5 As Byte
  2204.   Dim Counter6 As Byte
  2205.   Dim Counter7 As Byte
  2206.   Dim ElapsedTime As Double
  2207.   Dim MinAdjacency As Integer
  2208.   Dim NumRoomsInSolution As Integer
  2209.   Dim NumRoomsInSolutionAtMin As Integer
  2210.   Dim RN(7) As Integer
  2211.   Dim RNIndex1 As Integer
  2212.   Dim RNIndex2 As Integer
  2213.   Dim SeedByte(7) As Byte
  2214.   Dim SeedByteAtMin(7) As Byte
  2215.   Dim SeedLength As Integer
  2216.   Dim StartTime As Double
  2217.   SeedLength = Len(Seed)
  2218.   If SeedLength > 8 Then SeedLength = 8
  2219.   RNIndex1 = 0
  2220.   For RNIndex2 = 1 To SeedLength
  2221.     RN(RNIndex1) = Asc(Mid$(Seed, RNIndex2, 1)) Mod 10
  2222.     RNIndex1 = RNIndex1 + 1
  2223.   Next RNIndex2
  2224.   RNIndex2 = 7
  2225.   Do While (RNIndex1 > 0)
  2226.     RNIndex1 = RNIndex1 - 1
  2227.     RN(RNIndex2) = RN(RNIndex1)
  2228.     RNIndex2 = RNIndex2 - 1
  2229.   Loop
  2230.   Do While (RNIndex2 >= 0)
  2231.     RN(RNIndex2) = 8
  2232.     RNIndex2 = RNIndex2 - 1
  2233.   Loop
  2234.   Counter0 = RN(0)
  2235.   Counter1 = RN(1)
  2236.   Counter2 = RN(2)
  2237.   Counter3 = RN(3)
  2238.   Counter4 = RN(4)
  2239.   Counter5 = RN(5)
  2240.   Counter6 = RN(6)
  2241.   Counter7 = RN(7)
  2242.   Call Hash(Counter0, Counter1, Counter2, Counter3, Counter4, Counter5, Counter6, Counter7)
  2243.   MinAdjacency = 2 * NumRoomsInMaze + 1
  2244.   NumRoomsInSolutionAtMin = 0
  2245.   SeedByteAtMin(0) = Counter0
  2246.   SeedByteAtMin(1) = Counter1
  2247.   SeedByteAtMin(2) = Counter2
  2248.   SeedByteAtMin(3) = Counter3
  2249.   SeedByteAtMin(4) = Counter4
  2250.   SeedByteAtMin(5) = Counter5
  2251.   SeedByteAtMin(6) = Counter6
  2252.   SeedByteAtMin(7) = Counter7
  2253.   StartTime = Timer
  2254.     SeedByte(0) = Counter0
  2255.     SeedByte(1) = Counter1
  2256.     SeedByte(2) = Counter2
  2257.     SeedByte(3) = Counter3
  2258.     SeedByte(4) = Counter4
  2259.     SeedByte(5) = Counter5
  2260.     SeedByte(6) = Counter6
  2261.     SeedByte(7) = Counter7
  2262.     Call SqrGenerateMaze(Page(), MaxX, MaxY, Stack(), NumColumns, NumRows, SeedByte())
  2263.     Call SqrSolveMaze(Stack(), Page(), NumRoomsInSolution, Adjacency, MaxX, MaxY)
  2264.     If 3 * NumRoomsInSolution >= NumRoomsInMaze Then
  2265.       If Adjacency < MinAdjacency Then
  2266.         MinAdjacency = Adjacency
  2267.         NumRoomsInSolutionAtMin = NumRoomsInSolution
  2268.         SeedByteAtMin(0) = SeedByte(0)
  2269.         SeedByteAtMin(1) = SeedByte(1)
  2270.         SeedByteAtMin(2) = SeedByte(2)
  2271.         SeedByteAtMin(3) = SeedByte(3)
  2272.         SeedByteAtMin(4) = SeedByte(4)
  2273.         SeedByteAtMin(5) = SeedByte(5)
  2274.         SeedByteAtMin(6) = SeedByte(6)
  2275.         SeedByteAtMin(7) = SeedByte(7)
  2276.       Else
  2277.         If Adjacency = MinAdjacency Then
  2278.           If NumRoomsInSolution > NumRoomsInSolutionAtMin Then
  2279.             NumRoomsInSolutionAtMin = NumRoomsInSolution
  2280.             SeedByteAtMin(0) = SeedByte(0)
  2281.             SeedByteAtMin(1) = SeedByte(1)
  2282.             SeedByteAtMin(2) = SeedByte(2)
  2283.             SeedByteAtMin(3) = SeedByte(3)
  2284.             SeedByteAtMin(4) = SeedByte(4)
  2285.             SeedByteAtMin(5) = SeedByte(5)
  2286.             SeedByteAtMin(6) = SeedByte(6)
  2287.             SeedByteAtMin(7) = SeedByte(7)
  2288.           End If
  2289.         End If
  2290.       End If
  2291.     End If
  2292.     Call Increment(Counter0, Counter1, Counter2, Counter3, Counter4, Counter5, Counter6, Counter7)
  2293.     ElapsedTime = Timer - StartTime
  2294.   Loop While ((ElapsedTime >= 0#) And (ElapsedTime < SecondsForMazeSelection))
  2295.   Call SqrGenerateMaze(Page(), MaxX, MaxY, Stack(), NumColumns, NumRows, SeedByteAtMin())
  2296.   Call SqrSolveMaze(Stack(), Page(), NumRoomsInSolution, Adjacency, MaxX, MaxY)
  2297. End Sub
  2298. Private Sub SqrOutputMaze()
  2299.   Dim ObjectNum As Byte
  2300.   Dim Radians As Double
  2301.   Dim RadiansPerDegree As Double
  2302.   Dim SingleRectangle(3) As VertexRec
  2303.   Dim SingleTriangle(2) As VertexRec
  2304.   Dim TemDouble1 As Double
  2305.   Dim TemDouble2 As Double
  2306.   Dim TemDouble3 As Double
  2307.   Dim TemDouble4 As Double
  2308.   Dim Triangle(3, 2) As VertexRec
  2309.   Dim VertexNum As Byte
  2310.   Dim XMod8 As Byte
  2311.   Dim X0 As Double
  2312.   Dim X1 As Double
  2313.   Dim X2 As Double
  2314.   Dim X3 As Double
  2315.   Dim Y0 As Double
  2316.   Dim Y1 As Double
  2317.   Dim Y2 As Double
  2318.   Dim Y3 As Double
  2319.   Select Case State
  2320.     Case 0
  2321.       Text1.Text = ""
  2322.       ScaleMode = 1
  2323.       If (Resize) Then
  2324.         TemDouble1 = ScaleWidth - VScroll1.Width
  2325.         TemDouble2 = MinWallLengthInInches
  2326.         TemDouble2 = 1440# * TemDouble2
  2327.         TemDouble3 = RelativeWidthOfWall
  2328.         NumColumns = Int(TemDouble1 / TemDouble2 - TemDouble3)
  2329.         If NumColumns < 2 Then NumColumns = 2
  2330.         TemDouble1 = ScaleHeight - Text1.Height
  2331.         TemDouble2 = ScaleWidth - VScroll1.Width
  2332.         ScaleMode = 3
  2333.         TemDouble3 = NumColumns
  2334.         NumRows = Int((TemDouble1 * TemDouble3) / TemDouble2)
  2335.         If NumRows < 2 Then NumRows = 2
  2336.         Tilt = 90 - VScroll1.Value
  2337.         MaxX = 2 * NumColumns
  2338.         MaxY = 2 * NumRows
  2339.         NumRoomsInMaze = NumRows * NumColumns
  2340.         ReDim ComputerPage(MaxY, MaxX)
  2341.         ReDim UserPage(MaxY, MaxX)
  2342.         ReDim Stack(NumRoomsInMaze)
  2343.         Call SqrSelectMaze(Seed, ComputerPage(), MaxX, MaxY, Stack(), NumRoomsInMaze, NumColumns, NumRows, SecondsForMazeSelection)
  2344.         For UserX = 0 To MaxX
  2345.           For UserY = 0 To MaxY
  2346.             If ComputerPage(UserY, UserX) = 0 Then
  2347.               UserPage(UserY, UserX) = 0
  2348.             Else
  2349.               UserPage(UserY, UserX) = 2
  2350.             End If
  2351.           Next UserY
  2352.         Next UserX
  2353.         UserX = 1
  2354.         UserXRelative = (RelativeWidthOfWall + 1#) / 2#
  2355.         UserY = 1
  2356.         UserYRelative = (RelativeWidthOfWall + 1#) / 2#
  2357.         UserPage(UserY, UserX) = 1
  2358.         Resize = False
  2359.       End If
  2360.       If (Paint) Then
  2361.         ScaleMode = 3
  2362.         Cls
  2363.         RadiansPerDegree = Atn(1#) / 45#
  2364.         Radians = Tilt * RadiansPerDegree
  2365.         SinTilt = Sin(Radians)
  2366.         CosTilt = Cos(Radians)
  2367.         TemDouble1 = NumColumns
  2368.         XMax = TemDouble1 + RelativeWidthOfWall
  2369.         TemDouble1 = ScaleWidth - VScroll1.Width
  2370.         PixelsPerX = (TemDouble1 - 1#) / (XMax * (XMax / (XMax - RelativeHeightOfWall)))
  2371.         XOffset = (XMax / 2#) * (RelativeHeightOfWall / (XMax - RelativeHeightOfWall))
  2372.         TemDouble1 = NumRows
  2373.         YMax = TemDouble1 + RelativeWidthOfWall
  2374.         TemDouble1 = ScaleHeight - Text1.Height
  2375.         PixelsPerZ = (TemDouble1 - 1#) / Sqr(YMax * YMax + RelativeHeightOfWall * RelativeHeightOfWall)
  2376.         If YMax > XMax Then
  2377.           RelDistOfUserFromScreen = YMax
  2378.         Else
  2379.           RelDistOfUserFromScreen = XMax
  2380.         End If
  2381.         Paint = False
  2382.       End If
  2383.       If State = 0 Then
  2384.         State = 1
  2385.         DoEvents
  2386.         If State < 5 Then
  2387.           Timer1.Enabled = True
  2388.         End If
  2389.       End If
  2390.     Case 1
  2391.       BaseRectangle(0, 0).X = 0#
  2392.       BaseRectangle(0, 0).Y = 0#
  2393.       BaseRectangle(0, 1).X = RelativeWidthOfWall
  2394.       BaseRectangle(0, 1).Y = 0#
  2395.       BaseRectangle(0, 2).X = RelativeWidthOfWall
  2396.       BaseRectangle(0, 2).Y = RelativeWidthOfWall
  2397.       BaseRectangle(0, 3).X = 0#
  2398.       BaseRectangle(0, 3).Y = RelativeWidthOfWall
  2399.       BaseRectangle(1, 0).X = RelativeWidthOfWall
  2400.       BaseRectangle(1, 0).Y = 0#
  2401.       BaseRectangle(1, 1).X = 1#
  2402.       BaseRectangle(1, 1).Y = 0#
  2403.       BaseRectangle(1, 2).X = 1#
  2404.       BaseRectangle(1, 2).Y = RelativeWidthOfWall
  2405.       BaseRectangle(1, 3).X = RelativeWidthOfWall
  2406.       BaseRectangle(1, 3).Y = RelativeWidthOfWall
  2407.       BaseRectangle(2, 0).X = RelativeWidthOfWall
  2408.       BaseRectangle(2, 0).Y = RelativeWidthOfWall
  2409.       BaseRectangle(2, 1).X = 1#
  2410.       BaseRectangle(2, 1).Y = RelativeWidthOfWall
  2411.       BaseRectangle(2, 2).X = 1#
  2412.       BaseRectangle(2, 2).Y = 1#
  2413.       BaseRectangle(2, 3).X = RelativeWidthOfWall
  2414.       BaseRectangle(2, 3).Y = 1#
  2415.       BaseRectangle(3, 0).X = 0#
  2416.       BaseRectangle(3, 0).Y = RelativeWidthOfWall
  2417.       BaseRectangle(3, 1).X = RelativeWidthOfWall
  2418.       BaseRectangle(3, 1).Y = RelativeWidthOfWall
  2419.       BaseRectangle(3, 2).X = RelativeWidthOfWall
  2420.       BaseRectangle(3, 2).Y = 1#
  2421.       BaseRectangle(3, 3).X = 0#
  2422.       BaseRectangle(3, 3).Y = 1#
  2423.       Rectangle(0, 0).X = 0#
  2424.       Rectangle(0, 0).Y = 0#
  2425.       Rectangle(0, 1).X = XMax
  2426.       Rectangle(0, 1).Y = 0#
  2427.       Rectangle(0, 2).X = XMax
  2428.       Rectangle(0, 2).Y = YMax
  2429.       Rectangle(0, 3).X = 0#
  2430.       Rectangle(0, 3).Y = YMax
  2431.       If UsePalette Then
  2432.         OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  2433.         NumRealized = RealizePalette(frm3DMaze.hDC)
  2434.       End If
  2435.       X0 = Rectangle(0, 0).X
  2436.       Y0 = Rectangle(0, 0).Y
  2437.       X1 = Rectangle(0, 1).X
  2438.       Y1 = Rectangle(0, 1).Y
  2439.       X2 = Rectangle(0, 2).X
  2440.       Y2 = Rectangle(0, 2).Y
  2441.       X3 = Rectangle(0, 3).X
  2442.       Y3 = Rectangle(0, 3).Y
  2443.       Call DisplayQuadrilateral(XMax, XOffset, YMax, X0, Y0, 0#, X1, Y1, 0#, X2, Y2, 0#, X3, Y3, 0#, PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, FloorColor)
  2444.       Y = 0
  2445.       YOffset = 0
  2446.       State = 4
  2447.       If UsePalette Then
  2448.         NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  2449.       End If
  2450.       DoEvents
  2451.       If State < 5 Then
  2452.         Timer1.Enabled = True
  2453.       End If
  2454.     Case 4
  2455.       If UsePalette Then
  2456.         OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  2457.         NumRealized = RealizePalette(frm3DMaze.hDC)
  2458.       End If
  2459.       If Y <= MaxY Then
  2460.         For VertexNum = 0 To 3
  2461.           Rectangle(0, VertexNum).X = BaseRectangle(0, VertexNum).X
  2462.           Rectangle(0, VertexNum).Y = BaseRectangle(0, VertexNum).Y + YOffset
  2463.         Next VertexNum
  2464.         X = 0
  2465.         Do While X <= MaxX
  2466.           If ComputerPage(Y, X) = 0 Then
  2467.             SingleRectangle(0).X = Rectangle(0, 0).X
  2468.             SingleRectangle(0).Y = Rectangle(0, 0).Y
  2469.             SingleRectangle(1).X = Rectangle(0, 1).X
  2470.             SingleRectangle(1).Y = Rectangle(0, 1).Y
  2471.             SingleRectangle(2).X = Rectangle(0, 2).X
  2472.             SingleRectangle(2).Y = Rectangle(0, 2).Y
  2473.             SingleRectangle(3).X = Rectangle(0, 3).X
  2474.             SingleRectangle(3).Y = Rectangle(0, 3).Y
  2475.             Call OutputLeftRight(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen)
  2476.           End If
  2477.           For VertexNum = 0 To 3
  2478.             Rectangle(0, VertexNum).X = Rectangle(0, VertexNum).X + 1
  2479.           Next VertexNum
  2480.           X = X + 2
  2481.         Loop
  2482.         For VertexNum = 0 To 3
  2483.           Rectangle(0, VertexNum).X = BaseRectangle(0, VertexNum).X
  2484.           Rectangle(0, VertexNum).Y = BaseRectangle(0, VertexNum).Y + YOffset
  2485.         Next VertexNum
  2486.         For VertexNum = 0 To 3
  2487.           Rectangle(1, VertexNum).X = BaseRectangle(1, VertexNum).X
  2488.           Rectangle(1, VertexNum).Y = BaseRectangle(1, VertexNum).Y + YOffset
  2489.         Next VertexNum
  2490.         X = 0
  2491.         Do While X <= MaxX
  2492.           If ComputerPage(Y, X) = 0 Then
  2493.             SingleRectangle(0).X = Rectangle(0, 0).X
  2494.             SingleRectangle(0).Y = Rectangle(0, 0).Y
  2495.             SingleRectangle(1).X = Rectangle(0, 1).X
  2496.             SingleRectangle(1).Y = Rectangle(0, 1).Y
  2497.             SingleRectangle(2).X = Rectangle(0, 2).X
  2498.             SingleRectangle(2).Y = Rectangle(0, 2).Y
  2499.             SingleRectangle(3).X = Rectangle(0, 3).X
  2500.             SingleRectangle(3).Y = Rectangle(0, 3).Y
  2501.             Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleWEColor)
  2502.           End If
  2503.           For VertexNum = 0 To 3
  2504.             Rectangle(0, VertexNum).X = Rectangle(0, VertexNum).X + 1
  2505.           Next VertexNum
  2506.           X = X + 1
  2507.           If X <= MaxX Then
  2508.             If ComputerPage(Y, X) = 0 Then
  2509.               SingleRectangle(0).X = Rectangle(1, 0).X
  2510.               SingleRectangle(0).Y = Rectangle(1, 0).Y
  2511.               SingleRectangle(1).X = Rectangle(1, 1).X
  2512.               SingleRectangle(1).Y = Rectangle(1, 1).Y
  2513.               SingleRectangle(2).X = Rectangle(1, 2).X
  2514.               SingleRectangle(2).Y = Rectangle(1, 2).Y
  2515.               SingleRectangle(3).X = Rectangle(1, 3).X
  2516.               SingleRectangle(3).Y = Rectangle(1, 3).Y
  2517.               Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleWEColor)
  2518.             End If
  2519.             For VertexNum = 0 To 3
  2520.               Rectangle(1, VertexNum).X = Rectangle(1, VertexNum).X + 1
  2521.             Next VertexNum
  2522.             X = X + 1
  2523.           End If
  2524.         Loop
  2525.         Y = Y + 1
  2526.         If Y <= MaxY Then
  2527.           For VertexNum = 0 To 3
  2528.             Rectangle(3, VertexNum).X = BaseRectangle(3, VertexNum).X
  2529.             Rectangle(3, VertexNum).Y = BaseRectangle(3, VertexNum).Y + YOffset
  2530.           Next VertexNum
  2531.           X = 0
  2532.           Do While X <= MaxX
  2533.             If ComputerPage(Y, X) = 0 Then
  2534.               SingleRectangle(0).X = Rectangle(3, 0).X
  2535.               SingleRectangle(0).Y = Rectangle(3, 0).Y
  2536.               SingleRectangle(1).X = Rectangle(3, 1).X
  2537.               SingleRectangle(1).Y = Rectangle(3, 1).Y
  2538.               SingleRectangle(2).X = Rectangle(3, 2).X
  2539.               SingleRectangle(2).Y = Rectangle(3, 2).Y
  2540.               SingleRectangle(3).X = Rectangle(3, 3).X
  2541.               SingleRectangle(3).Y = Rectangle(3, 3).Y
  2542.               Call OutputLeftRight(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen)
  2543.             End If
  2544.             For VertexNum = 0 To 3
  2545.               Rectangle(3, VertexNum).X = Rectangle(3, VertexNum).X + 1
  2546.             Next VertexNum
  2547.             X = X + 2
  2548.           Loop
  2549.           For VertexNum = 0 To 3
  2550.             Rectangle(3, VertexNum).X = BaseRectangle(3, VertexNum).X
  2551.             Rectangle(3, VertexNum).Y = BaseRectangle(3, VertexNum).Y + YOffset
  2552.           Next VertexNum
  2553.           X = 0
  2554.           Do While X <= MaxX
  2555.             If ComputerPage(Y, X) = 0 Then
  2556.               SingleRectangle(0).X = Rectangle(3, 0).X
  2557.               SingleRectangle(0).Y = Rectangle(3, 0).Y
  2558.               SingleRectangle(1).X = Rectangle(3, 1).X
  2559.               SingleRectangle(1).Y = Rectangle(3, 1).Y
  2560.               SingleRectangle(2).X = Rectangle(3, 2).X
  2561.               SingleRectangle(2).Y = Rectangle(3, 2).Y
  2562.               SingleRectangle(3).X = Rectangle(3, 3).X
  2563.               SingleRectangle(3).Y = Rectangle(3, 3).Y
  2564.               Call OutputRectangle(XMax, XOffset, YMax, SingleRectangle(), PixelsPerX, PixelsPerZ, CosTilt, SinTilt, RelDistOfUserFromScreen, RectangleWEColor)
  2565.             End If
  2566.             For VertexNum = 0 To 3
  2567.               Rectangle(3, VertexNum).X = Rectangle(3, VertexNum).X + 1
  2568.             Next VertexNum
  2569.             X = X + 2
  2570.           Loop
  2571.           Y = Y + 1
  2572.         End If
  2573.         YOffset = YOffset + 1
  2574.       Else
  2575.         State = 5
  2576.       End If
  2577.       If UsePalette Then
  2578.         NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  2579.       End If
  2580.       DoEvents
  2581.       If State < 5 Then
  2582.         Timer1.Enabled = True
  2583.       Else
  2584.         If State = 5 Then
  2585.           AlreadyPainting = False
  2586.           Call SqrDisplayUserMoves(MaxX, MaxY, UserPage, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  2587.           If SolutionDisplayed Then
  2588.             Call SqrDisplaySolution(MaxY, ComputerPage, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  2589.             Text1.Text = ""
  2590.           Else
  2591.             If UserHasSolved Then
  2592.               Text1.Text = "Congratulations!"
  2593.             Else
  2594.               Text1.Text = "Use the arrow keys to solve."
  2595.             End If
  2596.           End If
  2597.           mnuActionItem(1).Enabled = True
  2598.           mnuActionItem(2).Enabled = True
  2599.         End If
  2600.       End If
  2601.     Case Else
  2602.       DoEvents
  2603.   End Select
  2604. End Sub
  2605. Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  2606.   If ((State = 5) And (Not SolutionDisplayed) And (Not UserHasSolved)) Then
  2607.     Dim DeltaIndex1 As Integer
  2608.     Dim OldPaletteHandle As Long
  2609.     Dim PassageFound As Integer
  2610.     Dim TemDouble As Double
  2611.     Dim XNext As Integer
  2612.     Dim XRelativeNext As Double
  2613.     Dim YNext As Integer
  2614.     Dim YRelativeNext As Double
  2615.     PassageFound = True
  2616.     DeltaIndex1 = -1
  2617.     If mnuStyleItem(0).Checked Then
  2618.       Select Case KeyCode
  2619.         Case vbKeyPageDown, vbKeyNumpad3
  2620.           DeltaIndex1 = 5
  2621.           KeyCode = 0
  2622.         Case vbKeyHome, vbKeyNumpad7
  2623.           DeltaIndex1 = 0
  2624.           KeyCode = 0
  2625.         Case vbKeyLeft, vbKeyNumpad4
  2626.           Beep
  2627.           KeyCode = 0
  2628.         Case vbKeyUp, vbKeyNumpad8
  2629.           DeltaIndex1 = 2
  2630.           KeyCode = 0
  2631.         Case vbKeyRight, vbKeyNumpad6
  2632.           Beep
  2633.           KeyCode = 0
  2634.         Case vbKeyDown, vbKeyNumpad2
  2635.           DeltaIndex1 = 3
  2636.           KeyCode = 0
  2637.         Case vbKeyPageUp, vbKeyNumpad9
  2638.           DeltaIndex1 = 4
  2639.           KeyCode = 0
  2640.         Case vbKeyEnd, vbKeyNumpad1
  2641.           DeltaIndex1 = 1
  2642.           KeyCode = 0
  2643.       End Select
  2644.       If DeltaIndex1 >= 0 Then
  2645.         XNext = UserX + HexDeltaX(DeltaIndex1, 0)
  2646.         If XNext <= 0 Then
  2647.           PassageFound = False
  2648.         Else
  2649.           If XNext >= MaxX Then
  2650.             PassageFound = False
  2651.           Else
  2652.             YNext = UserY + HexDeltaY(DeltaIndex1, 0)
  2653.             If YNext <= 0 Then
  2654.               PassageFound = False
  2655.             Else
  2656.               If YNext > MaxY Then
  2657.                 PassageFound = False
  2658.               Else
  2659.                 If UserPage(YNext, XNext) = 0 Then
  2660.                   PassageFound = False
  2661.                 End If
  2662.               End If
  2663.             End If
  2664.           End If
  2665.         End If
  2666.         If PassageFound Then
  2667.           XNext = XNext + HexDeltaX(DeltaIndex1, 0)
  2668.           YNext = YNext + HexDeltaY(DeltaIndex1, 0)
  2669.           If YNext < MaxY Then
  2670.             If UserPage(YNext, XNext) = 1 Then
  2671.               CurrentColor = BackoutColor
  2672.               UserPage(UserY, UserX) = 3
  2673.             Else
  2674.               CurrentColor = AdvanceColor
  2675.               UserPage(YNext, XNext) = 1
  2676.             End If
  2677.             Select Case (YNext - UserY)
  2678.               Case -4
  2679.                 XRelativeNext = UserXRelative
  2680.                 YRelativeNext = UserYRelative - Sqrt3
  2681.               Case -2
  2682.                 If XNext > UserX Then
  2683.                   XRelativeNext = UserXRelative + 3# / 2#
  2684.                   YRelativeNext = UserYRelative - Sqrt3 / 2#
  2685.                 Else
  2686.                   XRelativeNext = UserXRelative - 3# / 2#
  2687.                   YRelativeNext = UserYRelative - Sqrt3 / 2#
  2688.                 End If
  2689.               Case 2
  2690.                 If XNext > UserX Then
  2691.                   XRelativeNext = UserXRelative + 3# / 2#
  2692.                   YRelativeNext = UserYRelative + Sqrt3 / 2#
  2693.                 Else
  2694.                   XRelativeNext = UserXRelative - 3# / 2#
  2695.                   YRelativeNext = UserYRelative + Sqrt3 / 2#
  2696.                 End If
  2697.               Case Else
  2698.                 XRelativeNext = UserXRelative
  2699.                 YRelativeNext = UserYRelative + Sqrt3
  2700.             End Select
  2701.             If UsePalette Then
  2702.               OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  2703.               NumRealized = RealizePalette(frm3DMaze.hDC)
  2704.             End If
  2705.             Call DrawLine(UserXRelative, UserYRelative, XRelativeNext, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  2706.             If UsePalette Then
  2707.               NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  2708.             End If
  2709.           Else
  2710.             CurrentColor = AdvanceColor
  2711.             If UsePalette Then
  2712.               OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  2713.               NumRealized = RealizePalette(frm3DMaze.hDC)
  2714.             End If
  2715.             Call DrawLine(UserXRelative, UserYRelative, UserXRelative, YMax, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  2716.             If UsePalette Then
  2717.               NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  2718.             End If
  2719.             UserHasSolved = True
  2720.             Text1.Text = "Congratulations!"
  2721.           End If
  2722.           UserX = XNext
  2723.           UserY = YNext
  2724.           UserXRelative = XRelativeNext
  2725.           UserYRelative = YRelativeNext
  2726.         Else
  2727.           Beep
  2728.         End If
  2729.       End If
  2730.     Else
  2731.       Select Case KeyCode
  2732.         Case vbKeyPageDown, vbKeyNumpad3
  2733.           Beep
  2734.           KeyCode = 0
  2735.         Case vbKeyHome, vbKeyNumpad7
  2736.           Beep
  2737.           KeyCode = 0
  2738.         Case vbKeyLeft, vbKeyNumpad4
  2739.           DeltaIndex1 = 0
  2740.           KeyCode = 0
  2741.         Case vbKeyUp, vbKeyNumpad8
  2742.           DeltaIndex1 = 3
  2743.           KeyCode = 0
  2744.         Case vbKeyRight, vbKeyNumpad6
  2745.           DeltaIndex1 = 2
  2746.           KeyCode = 0
  2747.         Case vbKeyDown, vbKeyNumpad2
  2748.           DeltaIndex1 = 1
  2749.           KeyCode = 0
  2750.         Case vbKeyPageUp, vbKeyNumpad9
  2751.           Beep
  2752.           KeyCode = 0
  2753.         Case vbKeyEnd, vbKeyNumpad1
  2754.           Beep
  2755.           KeyCode = 0
  2756.       End Select
  2757.       If DeltaIndex1 >= 0 Then
  2758.         XNext = UserX + SqrDeltaX(DeltaIndex1, 0)
  2759.         If XNext <= 0 Then
  2760.           PassageFound = False
  2761.         Else
  2762.           If XNext >= MaxX Then
  2763.             PassageFound = False
  2764.           Else
  2765.             YNext = UserY + SqrDeltaY(DeltaIndex1, 0)
  2766.             If YNext <= 0 Then
  2767.               PassageFound = False
  2768.             Else
  2769.               If YNext > MaxY Then
  2770.                 PassageFound = False
  2771.               Else
  2772.                 If UserPage(YNext, XNext) = 0 Then
  2773.                   PassageFound = False
  2774.                 End If
  2775.               End If
  2776.             End If
  2777.           End If
  2778.         End If
  2779.         If PassageFound Then
  2780.           XNext = XNext + SqrDeltaX(DeltaIndex1, 0)
  2781.           YNext = YNext + SqrDeltaY(DeltaIndex1, 0)
  2782.           If YNext < MaxY Then
  2783.             If UserPage(YNext, XNext) = 1 Then
  2784.               CurrentColor = BackoutColor
  2785.               UserPage(UserY, UserX) = 3
  2786.             Else
  2787.               CurrentColor = AdvanceColor
  2788.               UserPage(YNext, XNext) = 1
  2789.             End If
  2790.             TemDouble = SqrDeltaX(DeltaIndex1, 0)
  2791.             XRelativeNext = UserXRelative + TemDouble
  2792.             TemDouble = SqrDeltaY(DeltaIndex1, 0)
  2793.             YRelativeNext = UserYRelative + TemDouble
  2794.             If UsePalette Then
  2795.               OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  2796.               NumRealized = RealizePalette(frm3DMaze.hDC)
  2797.             End If
  2798.             Call DrawLine(UserXRelative, UserYRelative, XRelativeNext, YRelativeNext, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  2799.             If UsePalette Then
  2800.               NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  2801.             End If
  2802.           Else
  2803.             CurrentColor = AdvanceColor
  2804.             If UsePalette Then
  2805.               OldPaletteHandle = SelectPalette(frm3DMaze.hDC, PaletteHandle, 0)
  2806.               NumRealized = RealizePalette(frm3DMaze.hDC)
  2807.             End If
  2808.             Call DrawLine(UserXRelative, UserYRelative, UserXRelative, YMax, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  2809.             If UsePalette Then
  2810.               NumRealized = SelectPalette(frm3DMaze.hDC, OldPaletteHandle, 0)
  2811.             End If
  2812.             UserHasSolved = True
  2813.             Text1.Text = "Congratulations!"
  2814.           End If
  2815.           UserX = XNext
  2816.           UserY = YNext
  2817.           UserXRelative = XRelativeNext
  2818.           UserYRelative = YRelativeNext
  2819.         Else
  2820.           Beep
  2821.         End If
  2822.       End If
  2823.     End If
  2824.   End If
  2825. End Sub
  2826. Private Sub Form_Load()
  2827.   Dim ColorNum As Integer
  2828.   Dim DeltaIndex1a As Byte
  2829.   Dim DeltaIndex1b As Byte
  2830.   Dim DeltaIndex1c As Byte
  2831.   Dim DeltaIndex1d As Byte
  2832.   Dim DeltaIndex1e As Byte
  2833.   Dim DeltaIndex1f As Byte
  2834.   Dim DeltaIndex2 As Integer
  2835.   Dim LogicalPalette As LOGPALETTE
  2836.   Dim NumBits As Long
  2837.   Dim NumColorsFree As Long
  2838.   Dim Tint As Integer
  2839.   OldPaletteHandle = 0
  2840.   AlreadyPainting = False
  2841.   SolutionDisplayed = False
  2842.   UserHasSolved = False
  2843.   State = 0
  2844.   Minimized = False
  2845.   mnuStyleItem(0).Checked = False
  2846.   mnuStyleItem(1).Checked = True
  2847.   SubstitutionHigh(0) = 4
  2848.   SubstitutionHigh(1) = 1
  2849.   SubstitutionHigh(2) = 2
  2850.   SubstitutionHigh(3) = 8
  2851.   SubstitutionHigh(4) = 8
  2852.   SubstitutionHigh(5) = 9
  2853.   SubstitutionHigh(6) = 9
  2854.   SubstitutionHigh(7) = 6
  2855.   SubstitutionHigh(8) = 5
  2856.   SubstitutionHigh(9) = 7
  2857.   SubstitutionHigh(10) = 2
  2858.   SubstitutionHigh(11) = 1
  2859.   SubstitutionHigh(12) = 2
  2860.   SubstitutionHigh(13) = 9
  2861.   SubstitutionHigh(14) = 8
  2862.   SubstitutionHigh(15) = 8
  2863.   SubstitutionHigh(16) = 6
  2864.   SubstitutionHigh(17) = 3
  2865.   SubstitutionHigh(18) = 5
  2866.   SubstitutionHigh(19) = 1
  2867.   SubstitutionHigh(20) = 9
  2868.   SubstitutionHigh(21) = 5
  2869.   SubstitutionHigh(22) = 4
  2870.   SubstitutionHigh(23) = 4
  2871.   SubstitutionHigh(24) = 9
  2872.   SubstitutionHigh(25) = 8
  2873.   SubstitutionHigh(26) = 6
  2874.   SubstitutionHigh(27) = 0
  2875.   SubstitutionHigh(28) = 8
  2876.   SubstitutionHigh(29) = 0
  2877.   SubstitutionHigh(30) = 6
  2878.   SubstitutionHigh(31) = 0
  2879.   SubstitutionHigh(32) = 2
  2880.   SubstitutionHigh(33) = 4
  2881.   SubstitutionHigh(34) = 1
  2882.   SubstitutionHigh(35) = 9
  2883.   SubstitutionHigh(36) = 2
  2884.   SubstitutionHigh(37) = 0
  2885.   SubstitutionHigh(38) = 7
  2886.   SubstitutionHigh(39) = 4
  2887.   SubstitutionHigh(40) = 7
  2888.   SubstitutionHigh(41) = 3
  2889.   SubstitutionHigh(42) = 0
  2890.   SubstitutionHigh(43) = 0
  2891.   SubstitutionHigh(44) = 2
  2892.   SubstitutionHigh(45) = 6
  2893.   SubstitutionHigh(46) = 8
  2894.   SubstitutionHigh(47) = 9
  2895.   SubstitutionHigh(48) = 4
  2896.   SubstitutionHigh(49) = 0
  2897.   SubstitutionHigh(50) = 8
  2898.   SubstitutionHigh(51) = 3
  2899.   SubstitutionHigh(52) = 2
  2900.   SubstitutionHigh(53) = 3
  2901.   SubstitutionHigh(54) = 2
  2902.   SubstitutionHigh(55) = 5
  2903.   SubstitutionHigh(56) = 2
  2904.   SubstitutionHigh(57) = 4
  2905.   SubstitutionHigh(58) = 6
  2906.   SubstitutionHigh(59) = 9
  2907.   SubstitutionHigh(60) = 7
  2908.   SubstitutionHigh(61) = 9
  2909.   SubstitutionHigh(62) = 1
  2910.   SubstitutionHigh(63) = 3
  2911.   SubstitutionHigh(64) = 5
  2912.   SubstitutionHigh(65) = 7
  2913.   SubstitutionHigh(66) = 1
  2914.   SubstitutionHigh(67) = 1
  2915.   SubstitutionHigh(68) = 4
  2916.   SubstitutionHigh(69) = 5
  2917.   SubstitutionHigh(70) = 8
  2918.   SubstitutionHigh(71) = 1
  2919.   SubstitutionHigh(72) = 6
  2920.   SubstitutionHigh(73) = 0
  2921.   SubstitutionHigh(74) = 5
  2922.   SubstitutionHigh(75) = 7
  2923.   SubstitutionHigh(76) = 8
  2924.   SubstitutionHigh(77) = 2
  2925.   SubstitutionHigh(78) = 3
  2926.   SubstitutionHigh(79) = 3
  2927.   SubstitutionHigh(80) = 7
  2928.   SubstitutionHigh(81) = 3
  2929.   SubstitutionHigh(82) = 5
  2930.   SubstitutionHigh(83) = 1
  2931.   SubstitutionHigh(84) = 7
  2932.   SubstitutionHigh(85) = 5
  2933.   SubstitutionHigh(86) = 4
  2934.   SubstitutionHigh(87) = 0
  2935.   SubstitutionHigh(88) = 3
  2936.   SubstitutionHigh(89) = 6
  2937.   SubstitutionHigh(90) = 3
  2938.   SubstitutionHigh(91) = 7
  2939.   SubstitutionHigh(92) = 7
  2940.   SubstitutionHigh(93) = 1
  2941.   SubstitutionHigh(94) = 9
  2942.   SubstitutionHigh(95) = 4
  2943.   SubstitutionHigh(96) = 0
  2944.   SubstitutionHigh(97) = 5
  2945.   SubstitutionHigh(98) = 6
  2946.   SubstitutionHigh(99) = 6
  2947.   SubstitutionLow(0) = 1
  2948.   SubstitutionLow(1) = 2
  2949.   SubstitutionLow(2) = 2
  2950.   SubstitutionLow(3) = 1
  2951.   SubstitutionLow(4) = 5
  2952.   SubstitutionLow(5) = 5
  2953.   SubstitutionLow(6) = 4
  2954.   SubstitutionLow(7) = 6
  2955.   SubstitutionLow(8) = 4
  2956.   SubstitutionLow(9) = 6
  2957.   SubstitutionLow(10) = 4
  2958.   SubstitutionLow(11) = 4
  2959.   SubstitutionLow(12) = 5
  2960.   SubstitutionLow(13) = 6
  2961.   SubstitutionLow(14) = 6
  2962.   SubstitutionLow(15) = 3
  2963.   SubstitutionLow(16) = 0
  2964.   SubstitutionLow(17) = 9
  2965.   SubstitutionLow(18) = 6
  2966.   SubstitutionLow(19) = 5
  2967.   SubstitutionLow(20) = 7
  2968.   SubstitutionLow(21) = 2
  2969.   SubstitutionLow(22) = 0
  2970.   SubstitutionLow(23) = 9
  2971.   SubstitutionLow(24) = 3
  2972.   SubstitutionLow(25) = 4
  2973.   SubstitutionLow(26) = 2
  2974.   SubstitutionLow(27) = 3
  2975.   SubstitutionLow(28) = 9
  2976.   SubstitutionLow(29) = 1
  2977.   SubstitutionLow(30) = 9
  2978.   SubstitutionLow(31) = 9
  2979.   SubstitutionLow(32) = 9
  2980.   SubstitutionLow(33) = 3
  2981.   SubstitutionLow(34) = 8
  2982.   SubstitutionLow(35) = 9
  2983.   SubstitutionLow(36) = 3
  2984.   SubstitutionLow(37) = 4
  2985.   SubstitutionLow(38) = 1
  2986.   SubstitutionLow(39) = 5
  2987.   SubstitutionLow(40) = 0
  2988.   SubstitutionLow(41) = 5
  2989.   SubstitutionLow(42) = 2
  2990.   SubstitutionLow(43) = 7
  2991.   SubstitutionLow(44) = 0
  2992.   SubstitutionLow(45) = 8
  2993.   SubstitutionLow(46) = 8
  2994.   SubstitutionLow(47) = 0
  2995.   SubstitutionLow(48) = 4
  2996.   SubstitutionLow(49) = 5
  2997.   SubstitutionLow(50) = 0
  2998.   SubstitutionLow(51) = 3
  2999.   SubstitutionLow(52) = 6
  3000.   SubstitutionLow(53) = 8
  3001.   SubstitutionLow(54) = 1
  3002.   SubstitutionLow(55) = 7
  3003.   SubstitutionLow(56) = 8
  3004.   SubstitutionLow(57) = 8
  3005.   SubstitutionLow(58) = 7
  3006.   SubstitutionLow(59) = 1
  3007.   SubstitutionLow(60) = 3
  3008.   SubstitutionLow(61) = 2
  3009.   SubstitutionLow(62) = 7
  3010.   SubstitutionLow(63) = 7
  3011.   SubstitutionLow(64) = 1
  3012.   SubstitutionLow(65) = 8
  3013.   SubstitutionLow(66) = 0
  3014.   SubstitutionLow(67) = 3
  3015.   SubstitutionLow(68) = 7
  3016.   SubstitutionLow(69) = 5
  3017.   SubstitutionLow(70) = 2
  3018.   SubstitutionLow(71) = 6
  3019.   SubstitutionLow(72) = 4
  3020.   SubstitutionLow(73) = 0
  3021.   SubstitutionLow(74) = 9
  3022.   SubstitutionLow(75) = 9
  3023.   SubstitutionLow(76) = 7
  3024.   SubstitutionLow(77) = 7
  3025.   SubstitutionLow(78) = 4
  3026.   SubstitutionLow(79) = 6
  3027.   SubstitutionLow(80) = 2
  3028.   SubstitutionLow(81) = 0
  3029.   SubstitutionLow(82) = 0
  3030.   SubstitutionLow(83) = 1
  3031.   SubstitutionLow(84) = 7
  3032.   SubstitutionLow(85) = 3
  3033.   SubstitutionLow(86) = 6
  3034.   SubstitutionLow(87) = 6
  3035.   SubstitutionLow(88) = 1
  3036.   SubstitutionLow(89) = 1
  3037.   SubstitutionLow(90) = 2
  3038.   SubstitutionLow(91) = 4
  3039.   SubstitutionLow(92) = 5
  3040.   SubstitutionLow(93) = 9
  3041.   SubstitutionLow(94) = 8
  3042.   SubstitutionLow(95) = 2
  3043.   SubstitutionLow(96) = 8
  3044.   SubstitutionLow(97) = 8
  3045.   SubstitutionLow(98) = 3
  3046.   SubstitutionLow(99) = 5
  3047.   NumColorsFree = 1
  3048.   NumBits = GetDeviceCaps(frm3DMaze.hDC, PLANES) * GetDeviceCaps(frm3DMaze.hDC, BITSPIXEL)
  3049.   If NumBits >= 31 Then
  3050.     UsePalette = False
  3051.   Else
  3052.     Do While (NumBits > 0)
  3053.       NumColorsFree = 2 * NumColorsFree
  3054.       NumBits = NumBits - 1
  3055.     Loop
  3056.     NumColorsFree = NumColorsFree - GetDeviceCaps(frm3DMaze.hDC, COLORS)
  3057.     If NumColorsFree < 16 Then
  3058.       UsePalette = False
  3059.     Else
  3060.       UsePalette = True
  3061.     End If
  3062.   End If
  3063.   LogicalPalette.palVersion = 3 * 256
  3064.   LogicalPalette.palNumEntries = 16
  3065.   For ColorNum = 0 To NumColors - 4
  3066.     ' evenly spaced shades of gray
  3067.     Tint = (256 * ColorNum) \ (NumColors - 3)
  3068.     LogicalPalette.palPalEntry(ColorNum).peRed = Tint
  3069.     LogicalPalette.palPalEntry(ColorNum).peGreen = Tint
  3070.     LogicalPalette.palPalEntry(ColorNum).peBlue = Tint
  3071.     LogicalPalette.palPalEntry(ColorNum).peFlags = PC_NOCOLLAPSE
  3072.     RedGreenBlue(ColorNum) = RGB(Tint, Tint, Tint)
  3073.   Next ColorNum
  3074.   LogicalPalette.palPalEntry(BackoutColor).peRed = 255
  3075.   LogicalPalette.palPalEntry(BackoutColor).peGreen = 255
  3076.   LogicalPalette.palPalEntry(BackoutColor).peBlue = 0
  3077.   LogicalPalette.palPalEntry(BackoutColor).peFlags = PC_NOCOLLAPSE
  3078.   RedGreenBlue(BackoutColor) = RGB(255, 255, 0)
  3079.   LogicalPalette.palPalEntry(AdvanceColor).peRed = 0
  3080.   LogicalPalette.palPalEntry(AdvanceColor).peGreen = 255
  3081.   LogicalPalette.palPalEntry(AdvanceColor).peBlue = 0
  3082.   LogicalPalette.palPalEntry(AdvanceColor).peFlags = PC_NOCOLLAPSE
  3083.   RedGreenBlue(AdvanceColor) = RGB(0, 255, 0)
  3084.   LogicalPalette.palPalEntry(SolutionColor).peRed = 255
  3085.   LogicalPalette.palPalEntry(SolutionColor).peGreen = 0
  3086.   LogicalPalette.palPalEntry(SolutionColor).peBlue = 0
  3087.   LogicalPalette.palPalEntry(SolutionColor).peFlags = PC_NOCOLLAPSE
  3088.   RedGreenBlue(SolutionColor) = RGB(255, 0, 0)
  3089.   If UsePalette Then
  3090.     PaletteHandle = CreatePalette(LogicalPalette)
  3091.   End If
  3092.   HexDeltaY(0, 0) = -1
  3093.   HexDeltaX(0, 0) = -2
  3094.   HexDeltaY(1, 0) = 1
  3095.   HexDeltaX(1, 0) = -2
  3096.   HexDeltaY(2, 0) = -2
  3097.   HexDeltaX(2, 0) = 0
  3098.   HexDeltaY(3, 0) = 2
  3099.   HexDeltaX(3, 0) = 0
  3100.   HexDeltaY(4, 0) = -1
  3101.   HexDeltaX(4, 0) = 2
  3102.   HexDeltaY(5, 0) = 1
  3103.   HexDeltaX(5, 0) = 2
  3104.   DeltaIndex2 = 0
  3105.   For DeltaIndex1a = 0 To 5
  3106.     For DeltaIndex1b = 0 To 5
  3107.       If DeltaIndex1a <> DeltaIndex1b Then
  3108.         For DeltaIndex1c = 0 To 5
  3109.           If (DeltaIndex1a <> DeltaIndex1c) And (DeltaIndex1b <> DeltaIndex1c) Then
  3110.             For DeltaIndex1d = 0 To 5
  3111.               If (DeltaIndex1a <> DeltaIndex1d) And (DeltaIndex1b <> DeltaIndex1d) And (DeltaIndex1c <> DeltaIndex1d) Then
  3112.                 For DeltaIndex1e = 0 To 5
  3113.                   If (DeltaIndex1a <> DeltaIndex1e) And (DeltaIndex1b <> DeltaIndex1e) And (DeltaIndex1c <> DeltaIndex1e) And (DeltaIndex1d <> DeltaIndex1e) Then
  3114.                     For DeltaIndex1f = 0 To 5
  3115.                       If (DeltaIndex1a <> DeltaIndex1f) And (DeltaIndex1b <> DeltaIndex1f) And (DeltaIndex1c <> DeltaIndex1f) And (DeltaIndex1d <> DeltaIndex1f) And (DeltaIndex1e <> DeltaIndex1f) Then
  3116.                         HexDeltaX(DeltaIndex1a, DeltaIndex2) = HexDeltaX(0, 0)
  3117.                         HexDeltaY(DeltaIndex1a, DeltaIndex2) = HexDeltaY(0, 0)
  3118.                         HexDeltaX(DeltaIndex1b, DeltaIndex2) = HexDeltaX(1, 0)
  3119.                         HexDeltaY(DeltaIndex1b, DeltaIndex2) = HexDeltaY(1, 0)
  3120.                         HexDeltaX(DeltaIndex1c, DeltaIndex2) = HexDeltaX(2, 0)
  3121.                         HexDeltaY(DeltaIndex1c, DeltaIndex2) = HexDeltaY(2, 0)
  3122.                         HexDeltaX(DeltaIndex1d, DeltaIndex2) = HexDeltaX(3, 0)
  3123.                         HexDeltaY(DeltaIndex1d, DeltaIndex2) = HexDeltaY(3, 0)
  3124.                         HexDeltaX(DeltaIndex1e, DeltaIndex2) = HexDeltaX(4, 0)
  3125.                         HexDeltaY(DeltaIndex1e, DeltaIndex2) = HexDeltaY(4, 0)
  3126.                         HexDeltaX(DeltaIndex1f, DeltaIndex2) = HexDeltaX(5, 0)
  3127.                         HexDeltaY(DeltaIndex1f, DeltaIndex2) = HexDeltaY(5, 0)
  3128.                         DeltaIndex2 = DeltaIndex2 + 1
  3129.                       End If
  3130.                     Next DeltaIndex1f
  3131.                   End If
  3132.                 Next DeltaIndex1e
  3133.               End If
  3134.             Next DeltaIndex1d
  3135.           End If
  3136.         Next DeltaIndex1c
  3137.       End If
  3138.     Next DeltaIndex1b
  3139.   Next DeltaIndex1a
  3140.   SqrDeltaY(0, 0) = 0
  3141.   SqrDeltaX(0, 0) = -1
  3142.   SqrDeltaY(1, 0) = 1
  3143.   SqrDeltaX(1, 0) = 0
  3144.   SqrDeltaY(2, 0) = 0
  3145.   SqrDeltaX(2, 0) = 1
  3146.   SqrDeltaY(3, 0) = -1
  3147.   SqrDeltaX(3, 0) = 0
  3148.   DeltaIndex2 = 0
  3149.   For DeltaIndex1a = 0 To 3
  3150.     For DeltaIndex1b = 0 To 3
  3151.       If DeltaIndex1a <> DeltaIndex1b Then
  3152.         For DeltaIndex1c = 0 To 3
  3153.           If (DeltaIndex1a <> DeltaIndex1c) And (DeltaIndex1b <> DeltaIndex1c) Then
  3154.             For DeltaIndex1d = 0 To 3
  3155.               If (DeltaIndex1a <> DeltaIndex1d) And (DeltaIndex1b <> DeltaIndex1d) And (DeltaIndex1c <> DeltaIndex1d) Then
  3156.                 SqrDeltaX(DeltaIndex1a, DeltaIndex2) = SqrDeltaX(0, 0)
  3157.                 SqrDeltaY(DeltaIndex1a, DeltaIndex2) = SqrDeltaY(0, 0)
  3158.                 SqrDeltaX(DeltaIndex1b, DeltaIndex2) = SqrDeltaX(1, 0)
  3159.                 SqrDeltaY(DeltaIndex1b, DeltaIndex2) = SqrDeltaY(1, 0)
  3160.                 SqrDeltaX(DeltaIndex1c, DeltaIndex2) = SqrDeltaX(2, 0)
  3161.                 SqrDeltaY(DeltaIndex1c, DeltaIndex2) = SqrDeltaY(2, 0)
  3162.                 SqrDeltaX(DeltaIndex1d, DeltaIndex2) = SqrDeltaX(3, 0)
  3163.                 SqrDeltaY(DeltaIndex1d, DeltaIndex2) = SqrDeltaY(3, 0)
  3164.                 DeltaIndex2 = DeltaIndex2 + 1
  3165.               End If
  3166.             Next DeltaIndex1d
  3167.           End If
  3168.         Next DeltaIndex1c
  3169.       End If
  3170.     Next DeltaIndex1b
  3171.   Next DeltaIndex1a
  3172.   Sqrt3 = Sqr(3#)
  3173. End Sub
  3174. Private Sub Form_Paint()
  3175.   mnuActionItem(1).Enabled = False
  3176.   mnuActionItem(2).Enabled = False
  3177.   Paint = True
  3178.   State = 0
  3179.   If Not AlreadyPainting Then
  3180.     AlreadyPainting = True
  3181.     Timer1.Enabled = True
  3182.   End If
  3183. End Sub
  3184. Private Sub Form_Resize()
  3185.   If WindowState = 1 Then
  3186.     Minimized = True
  3187.     Cls
  3188.     State = 5
  3189.     AlreadyPainting = False
  3190.   Else
  3191.     If ScaleHeight < 3 * Text1.Height Then
  3192.       Minimized = False
  3193.       Cls
  3194.       State = 5
  3195.       AlreadyPainting = False
  3196.       Text1.Text = "This window is too small!"
  3197.     Else
  3198.       VScroll1.Height = ScaleHeight - Text1.Height
  3199.       VScroll1.Left = ScaleWidth - VScroll1.Width
  3200.       Text1.Top = ScaleHeight - Text1.Height
  3201.       Text1.Width = ScaleWidth
  3202.       Paint = True
  3203.       State = 0
  3204.       If (Not Minimized) Then
  3205.         Resize = True
  3206.         UserHasSolved = False
  3207.         SolutionDisplayed = False
  3208.         Seed = Str(Timer)
  3209.       End If
  3210.       Minimized = False
  3211.       Refresh
  3212.     End If
  3213.   End If
  3214. End Sub
  3215. Private Sub Form_Unload(Cancel As Integer)
  3216.   State = 6
  3217.   Timer1.Enabled = False
  3218.   Erase Stack
  3219.   Erase UserPage
  3220.   Erase ComputerPage
  3221. End Sub
  3222. Private Sub mnuActionItem_Click(Index As Integer)
  3223.   Select Case Index
  3224.     Case 0
  3225.       SolutionDisplayed = False
  3226.       Call Form_Resize
  3227.     Case 1
  3228.       SolutionDisplayed = True
  3229.       Text1.Text = ""
  3230.       If mnuStyleItem(0).Checked Then
  3231.         Call HexDisplaySolution(MaxY, ComputerPage, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  3232.       Else
  3233.         Call SqrDisplaySolution(MaxY, ComputerPage, XMax, XOffset, YMax, CosTilt, SinTilt, PixelsPerX, PixelsPerZ, RelDistOfUserFromScreen)
  3234.       End If
  3235.     Case 2
  3236.       UserHasSolved = False
  3237.       SolutionDisplayed = False
  3238.       Paint = True
  3239.       State = 0
  3240.       For UserX = 0 To MaxX
  3241.         For UserY = 0 To MaxY
  3242.           If ComputerPage(UserY, UserX) = 0 Then
  3243.             UserPage(UserY, UserX) = 0
  3244.           Else
  3245.             UserPage(UserY, UserX) = 2
  3246.           End If
  3247.         Next UserY
  3248.       Next UserX
  3249.       If mnuStyleItem(0).Checked Then
  3250.         UserX = 3
  3251.         UserXRelative = 1#
  3252.         UserY = 2
  3253.         UserYRelative = Sqrt3 / 2#
  3254.       Else
  3255.         UserX = 1
  3256.         UserXRelative = (RelativeWidthOfWall + 1#) / 2#
  3257.         UserY = 1
  3258.         UserYRelative = (RelativeWidthOfWall + 1#) / 2#
  3259.       End If
  3260.       UserPage(UserY, UserX) = 1
  3261.       Refresh
  3262.     Case 4
  3263.       State = 6
  3264.       Timer1.Enabled = False
  3265.       Erase Stack
  3266.       Erase UserPage
  3267.       Erase ComputerPage
  3268.       End
  3269.     Case Else
  3270.   End Select
  3271. End Sub
  3272. Private Sub mnuHelpItem_Click(Index As Integer)
  3273.   Dim rc As Integer
  3274.   rc = MsgBox("3DMaze" + Chr(13) + Chr(13) + "Copyright " + Chr(169) + " 1995 James L. Dean (csvcjld@nomvs.lsumc.edu)" + Chr(13) + Chr(13) + "This application may be distributed without payment to James L. Dean." + Chr(13) + Chr(13) + "As per Microsoft's license for Visual Basic 4.0, the end-user may not distribute the components having names starting with other than " + Chr(34) + "3dmaze" + Chr(34) + ".", vbOKOnly, "About 3DMaze")
  3275. End Sub
  3276. Private Sub mnuStyleItem_Click(Index As Integer)
  3277.   Select Case Index
  3278.     Case 0
  3279.       If mnuStyleItem(1).Checked Then
  3280.         mnuStyleItem(0).Checked = True
  3281.         mnuStyleItem(1).Checked = False
  3282.         SolutionDisplayed = False
  3283.         Call Form_Resize
  3284.       End If
  3285.     Case 1
  3286.       If mnuStyleItem(0).Checked Then
  3287.         mnuStyleItem(0).Checked = False
  3288.         mnuStyleItem(1).Checked = True
  3289.         SolutionDisplayed = False
  3290.         Call Form_Resize
  3291.       End If
  3292.   End Select
  3293. End Sub
  3294. Private Sub Timer1_Timer()
  3295.   Timer1.Enabled = False
  3296.   If mnuStyleItem(0).Checked Then
  3297.     Call HexOutputMaze
  3298.   Else
  3299.     Call SqrOutputMaze
  3300.   End If
  3301. End Sub
  3302. Private Sub VScroll1_Change()
  3303.   Tilt = 90 - VScroll1.Value
  3304.   Paint = True
  3305.   State = 0
  3306.   If Not AlreadyPainting Then Call Form_Paint
  3307. End Sub
  3308. Private Sub VScroll1_Scroll()
  3309.   If AlreadyPainting Then
  3310.     Tilt = 90 - VScroll1.Value
  3311.     Paint = True
  3312.     State = 0
  3313.   End If
  3314. End Sub
  3315.